繁体   English   中英

如何在关机时停止带有无限循环的Python守护程序线程?

[英]How to stop a Python daemon thread with infinite loop at shutdown?

假设我有这样的事情:

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循环的exit子句? 我试过,我似乎不需要它 - 当程序退出时(在这种情况下,在睡眠后)然后程序终止,这也关闭了线程。

但我也见过这个代码 - 这只是不好的做法吗? 我可以逃脱没有控制循环的全局标志吗?

根据[Python 3.Docs]:线程 - 线程对象重点是我的):

线程可以标记为“守护程序线程”。 这个标志的意义在于, 当只剩下守护进程线程时,整个Python程序都会退出 初始值继承自创建线程。 可以通过守护程序属性或守护程序构造函数参数设置该标志。

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

按照上面的说法 ,从技术上讲,你不需要_FINISH逻辑,因为线程会在主线程结束时结束。
但是,根据你的代码, 没有人(主线程)表示线程应该结束 (类似于_FINISH = True ),因此线程中的逻辑是无用的(因此它可以被删除)。
此外,根据上面的建议,您应该在线程之间实现同步机制,并避免使它们成为守护进程 (在大多数情况下)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM