如何杀死所有线程?
在这个脚本:如何杀死所有线程?
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,我没有得到这么好的方法堆栈上问这些其他问题。
不可以单独的线程强制终止(这是不安全的,因为它可能导致锁持有,导致死锁等等)。
两种方式做这样的事情,这将是要么:
- 是否所有的线程推出为
daemon
线程,与主线程等待一个Event
/Condition
并尽快的线程组一个退出Event
或通知Condition
。只有(唯一)非daemon
线程退出,进程终止,daemon
线程全部终止 - 使用共享的
Event
所有线程间歇性轮询,因此它们在设置后立即协作退出。
感谢您的回答。我在这里看到了2种方法:http://*.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python但我真的不知道如何实现它发送给我的send()类。 – Sperly1987
你正在_Win_或_Ux_上运行你的代码吗? – CristiFati
我在Linux上运行 – Sperly1987
你想杀死所有的线程......这是否包括主线程和结果,应用程序?如果是这样,只需制作所有线程[守护进程](https://docs.python.org/3.4/library/threading.html#threading.Thread.daemon),然后当你想退出时,使用'sys.exit( )'。 – CristiFati
@CristiFati:如果'KeyboardInterrupt'传递给其中一个线程(接收它的线程基本上是随机的IIRC),这将无济于事。因此需要提醒主线程,以便在适当的时候“退出”。 – ShadowRanger
Right @ ShadowRanger,感谢您指出,线程倾向于吞噬异常。需要注意的是,当我处理线程时,我使用相反的方法:在线程循环中,如果按下了某个键(逻辑可以基于键进行扩展),请结束它。 – CristiFati