如何杀死所有线程?

问题描述:

在这个脚本:如何杀死所有线程?

import threading, socket  

class send(threading.Thread): 

    def run(self): 
     try: 
      while True: 
       try: 
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        s.connect((url,port)) 
        s.send(b"Hello world!") 
        print ("Request Sent!") 
       except: 
        s.close() 
     except KeyboardInterrupt: 
      # here i'd like to kill all threads if possible 

for x in range(800): 
    send().start() 

是否可以杀死所有的线程除了一个KeyboardInterrupt的?我在网上搜索和是的,我知道它已经被问到,但我真的是新的python,我没有得到这么好的方法堆栈上问这些其他问题。

+0

你想杀死所有的线程......这是否包括主线程和结果,应用程序?如果是这样,只需制作所有线程[守护进程](https://docs.python.org/3.4/library/threading.html#threading.Thread.daemon),然后当你想退出时,使用'sys.exit( )'。 – CristiFati

+0

@CristiFati:如果'KeyboardInterrupt'传递给其中一个线程(接收它的线程基本上是随机的IIRC),这将无济于事。因此需要提醒主线程,以便在适当的时候“退出”。 – ShadowRanger

+0

Right @ ShadowRanger,感谢您指出,线程倾向于吞噬异常。需要注意的是,当我处理线程时,我使用相反的方法:在线程循环中,如果按下了某个键(逻辑可以基于键进行扩展),请结束它。 – CristiFati

不可以单独的线程强制终止(这是不安全的,因为它可能导致锁持有,导致死锁等等)。

两种方式做这样的事情,这将是要么:

  1. 是否所有的线程推出为daemon线程,与主线程等待一个Event/Condition并尽快的线程组一个退出Event或通知Condition。只有(唯一)非daemon线程退出,进程终止,daemon线程全部终止
  2. 使用共享的Event所有线程间歇性轮询,因此它们在设置后立即协作退出。
+0

感谢您的回答。我在这里看到了2种方法:http://*.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python但我真的不知道如何实现它发送给我的send()类。 – Sperly1987

+0

你正在_Win_或_Ux_上运行你的代码吗? – CristiFati

+0

我在Linux上运行 – Sperly1987