[英]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.