假设我有这样的东西:
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循环的退出子句?我尝试过,但我似乎并不需要它-当程序退出时(在这种情况下,在睡眠之后)然后程序终止,这也关闭了线程。
但是我也看到了该代码-只是不好的做法吗?我可以摆脱没有用于控制循环的全局标志吗?
答案 0 :(得分:3)
根据[Python 3.Docs]: threading - Thread Objects(强调是我的):
可以将一个线程标记为“守护程序线程”。该标志的含义是仅保留守护程序线程时,整个Python程序都会退出。初始值是从创建线程继承的。可以通过daemon属性或 daemon 构造函数参数设置该标志。
注意:守护进程线程在关闭时突然停止。他们的资源(例如打开的文件,数据库事务等)可能无法正确释放。如果您希望线程正常停止,请使其变为非守护线程,并使用适当的信号传输机制,例如Event。
从上面讲,从技术上讲,您不需要 _FINISH 逻辑,因为线程将在主线程结束时结束。
但是,根据您的代码,没有一个(主线程)表示该线程应该结束(类似于_FINISH = True
之类的信号),因此线程中的逻辑是无用的(因此可以将其删除)。
另外,根据上述建议,您应该在线程之间实现同步机制,并避免使它们成为 daemon s(在大多数情况下)。