蟒蛇;杀死其他线程的最佳做法

时间:2015-11-20 18:59:55

标签: python multithreading

我想知道:在主应用程序收到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"将此循环作为事务返回,也不会停止循环的其余部分。

1 个答案:

答案 0 :(得分:2)

我通常只是将每个线程的daemon属性设置为True。这样,当主线程终止时,其他一切都会终止。

documentation对此事还有更多话要说:

  

守护程序线程在关闭时突然停止。他们的资源(例如打开文件,数据库事务等)可能无法正确发布。如果您希望线程正常停止,请使它们成为非守护进程并使用合适的信号机制,例如事件。