如何在关机时通过无限循环停止Python守护进程线程?

时间:2019-05-15 08:15:57

标签: python multithreading

假设我有这样的东西:

import threading
import time

_FINISH = False


def hang():
    while True:
        if _FINISH:
            break
        print 'hanging..'
        time.sleep(10)


def main():
    global _FINISH
    t = threading.Thread(target=hang)
    t.setDaemon( True )
    t.start()
    time.sleep(10)

if __name__ == '__main__':
    main()

如果我的线程是守护程序,是否需要全局_FINISH来控制break循环的退出子句?我尝试过,但我似乎并不需要它-当程序退出时(在这种情况下,在睡眠之后)然后程序终止,这也关闭了线程。

但是我也看到了该代码-只是不好的做法吗?我可以摆脱没有用于控制循环的全局标志吗?

1 个答案:

答案 0 :(得分:3)

根据[Python 3.Docs]: threading - Thread Objects强调是我的):

  

可以将一个线程标记为“守护程序线程”。该标志的含义是仅保留守护程序线程时,整个Python程序都会退出。初始值是从创建线程继承的。可以通过daemon属性或 daemon 构造函数参数设置该标志。

     

注意守护进程线程在关闭时突然停止。他们的资源(例如打开的文件,数据库事务等)可能无法正确释放。如果您希望线程正常停止,请使其变为非守护线程,并使用适当的信号传输机制,例如Event

从上面讲,从技术上讲,您不需要 _FINISH 逻辑,因为线程将在主线程结束时结束。
但是,根据您的代码,没有一个(主线程)表示该线程应该结束(类似于_FINISH = True之类的信号),因此线程中的逻辑是无用的(因此可以将其删除)。
另外,根据上述建议,您应该在线程之间实现同步机制,并避免使它们成为 daemon s(在大多数情况下)。