【问题标题】:How to exit python deamon thread gracefully如何优雅地退出python守护线程
【发布时间】:2020-07-10 09:36:03
【问题描述】:

我有如下代码

def run():
  While True:
    doSomething()
def main():
  thread = threading.thread(target = run)
  thread.setDaemon(True)
  thread.start() 
  doSomethingElse()

如果我像上面这样写代码,当主线程退出时,Deamon线程会退出,但可能还在doSomething的进程中。

main函数会在外面调用,我不允许在主线程中使用join, 有什么办法可以让守护线程在主线程完成后优雅退出。

【问题讨论】:

  • 请注意,daemon 线程的全部意义在于它们不会优雅地退出。您的目标实际上是“如何优雅地退出 daemon 线程”,还是“如何优雅地退出运行循环的线程”?

标签: python multithreading daemon


【解决方案1】:

您可以使用线程threading.Event 来指示子线程何时退出主线程。

例子:

class DemonThead(threading.Thread):

    def __init__(self):
        self.shutdown_flag = threading.Event()

    def run(self):
        while not self.shutdown_flag:
            # Run your code here
            pass

def main_thread():
    demon_thread = DemonThead()
    demon_thread.setDaemon(True) 
    demon_thread.start()
    
    # Stop your thread
    demon_thread.shutdown_flag.set()
    demon_thread.join()

【讨论】:

    【解决方案2】:

    你不能使用join,但是你可以设置一个Event并且不要使用daemonic标志。官方文档如下:

    注意:守护线程在关闭时突然停止。它们的资源(如打开的文件、数据库事务等)可能无法正常释放。如果您希望线程优雅地停止,请将它们设为非守护进程并使用合适的信号机制,例如事件。

    【讨论】: