我在一个队列上启动了一堆线程,我想在发送 SIGINT (Ctrl+C) 时杀死它们。处理此问题的最佳方法是什么?
targets = Queue.Queue()
threads_num = 10
threads = []
for i in threads_num:
t = MyThread()
t.setDaemon(True)
threads.append(t)
t.start()
targets.join()
最佳答案
如果您对让其他线程正常关闭不感兴趣,只需以守护进程模式启动它们并将队列的加入包装在终止线程中即可。
这样,您就可以使用线程的 join
方法——它支持超时并且不会阻止异常——而不必等待队列的 join
方法。
换句话说,做这样的事情:
term = Thread(target=someQueueVar.join)
term.daemon = True
term.start()
while (term.isAlive()):
term.join(3600)
现在,Ctrl+C 将终止 MainThread,随后 Python 解释器会硬杀死所有标记为“守护进程”的线程。请注意,这意味着您必须为所有其他线程设置“Thread.daemon”,或者通过捕获正确的异常(KeyboardInterrupt 或 SystemExit)并为它们退出做任何需要做的事情来优雅地关闭它们。
另请注意,您绝对需要将一个数字传递给term.join()
,否则它也会忽略所有异常。不过,您可以选择任意高的数字。
关于Python如何用信号杀死阻塞在队列上的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7610545/