如何在关闭时停止具有无限循环的Python守护线程?

3

假设我有这样一个东西:

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个回答

3
根据[Python 3.Docs]: threading - Thread Objects(我强调了):
线程可以被标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个Python程序将退出。初始值从创建线程继承。该标志可以通过daemon属性或daemon构造函数参数设置。
注意:在关闭时,守护线程会突然停止。他们的资源(如打开的文件、数据库事务等)可能不会被正确释放。如果你希望你的线程正常停止,请使它们成为非守护线程并使用适当的信号机制,例如Event
根据上述情况,从技术上讲,您不需要_FINISH逻辑,因为当主线程结束时,线程也会结束。
但是,根据您的代码,没有人(主线程)发出信号表明线程应该结束(类似于_FINISH = True),因此线程中的逻辑是无用的(因此可以删除)。
此外,根据上述建议,您应该在线程之间实现同步机制,并避免使它们成为守护程序(在大多数情况下)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接