我想知道:在主应用程序收到SIGINT的情况下,杀死主Python应用程序启动的线程的最佳做法是什么?
我正在做以下事情,但我强烈怀疑,因为需要杀死其他已启动的线程是一个常见问题,可能有更好的方法:
class Handler(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.keep_go = True
def run(self):
while self.keep_go:
#do something
def stop(self): #seems like i shouldn't have to do this myself
self.keep_go = False
try:
h = Handler()
h.start()
while True: #ENTER SOME OTHER LOOP HERE
#do something else
except KeyboardInterrupt: #seems like i shouldn't have to do this myself
pass
finally:
h.stop()
以下帖子是相关的,但我不清楚实际推荐的做法是什么,因为答案更多的是"这里有一些可能是hackish的方式你可以做到这一点" 。而且,我不需要突然杀死某些东西"我很乐意这样做"正确的方式":Is there any way to kill a Thread in Python?
编辑:我猜我的方法有一个小缺陷就是它不会杀死while循环中的当前处理。它没有收到" kill事件" " roll"将此循环作为事务返回,也不会停止循环的其余部分。
答案 0 :(得分:2)
我通常只是将每个线程的daemon
属性设置为True。这样,当主线程终止时,其他一切都会终止。
documentation对此事还有更多话要说:
守护程序线程在关闭时突然停止。他们的资源(例如打开文件,数据库事务等)可能无法正确发布。如果您希望线程正常停止,请使它们成为非守护进程并使用合适的信号机制,例如事件。