用键盘中断关闭所有线程

我在这里尝试的是使用键盘中断来退出程序中所有正在进行的线程。这是我创建线程的代码的精简版本:

taskDictionary中i的

:
尝试:
睡眠(60)
线程=线程(目标=mainModule.executeThread)
thread.start()
除键盘中断外:
线程。_停止()

程序本身要复杂得多,考虑了影响线程的大量不同变量,甚至可以选择以顺序模式启动,其中任务不是线程化的,而是逐个启动的,因此我刚才提出的这个小变化可能会有一些问题。
我这样做的方式产生了50/50的结果。中断可以工作,但线程永远不会干净地退出。有时它们会继续运行,但会停止未来线程的执行,有时它们会退出,并出现与中断有关的大量错误,而其他时候,中断根本不起作用。上次我运行这个程序时,程序停止了任何未来线程的执行,但没有停止当前线程。
有没有办法不进入线程实际执行的模块就退出线程

类似的问题是“如何杀死线程?”

您可以在线程中创建一个由线程模块中的锁或事件对象控制的退出处理程序。然后只需移除锁或向事件对象发送信号。这会通知线程它应该停止处理并正常退出。在主程序中向线程发送信号后,唯一要做的就是使用main中的thread.join()方法,该方法将等待线程关闭

举个简单的例子:

导入线程
导入时间
def定时_输出(名称、延迟、运行_事件):
当运行\u事件时。是否设置了\u()
时间。睡眠(延迟)
打印名称:“:新邮件!”
def main():
run_event=threading.event()
运行_event.set()
d1=1
t1=threading.Thread(目标=定时_输出,args=(“bob”,d1,run_事件))
d2=2
t2=threading.Thread(目标=定时_输出,args=(“paul”,d2,run_事件))
t1.start()
时间。睡眠(.5)
t2.start()
尝试:
而1:
时间。睡眠(.1)
除键盘中断外:
打印“正在尝试关闭线程。Max wait=”,Max(d1,d2)
运行\u事件。清除()
t1.join()
t2.join()
打印“线程成功关闭”
如果uuuu name uuuuuu=’\uuuuuuu main\uuuuuuu’:
main()

如果您确实需要杀死线程的功能,请使用多处理。它允许您将SIGTERMs发送到各个“进程”(它也非常类似于线程模块)。一般来说,线程是针对IO绑定的,而多处理是针对真正的处理器绑定的

发表评论