我显然误解了Python Thread对象的守护进程属性的基本内容。
请考虑以下事项:
daemonic.py
import sys, threading, time
class TestThread(threading.Thread):
def __init__(self, daemon):
threading.Thread.__init__(self)
self.daemon = daemon
def run(self):
x = 0
while 1:
if self.daemon:
print "Daemon :: %s" % x
else:
print "Non-Daemon :: %s" % x
x += 1
time.sleep(1)
if __name__ == "__main__":
print "__main__ start"
if sys.argv[1] == "daemonic":
thread = TestThread(True)
else:
thread = TestThread(False)
thread.start()
time.sleep(5)
print "__main__ stop"
来自python docs:
整个Python程序何时退出 没有活着的非守护进程线程。
因此,如果我使用TestThread作为守护进程运行,我希望它在主线程完成后退出。但这不会发生:
> python daemonic.py daemonic
__main__ start
Daemon :: 0
Daemon :: 1
Daemon :: 2
Daemon :: 3
Daemon :: 4
__main__ stop
Daemon :: 5
Daemon :: 6
^C
我得到了什么?
正如贾斯汀和布伦特所猜测的那样,我使用的是Python 2.5。刚刚回家并在我自己的机器上运行2.7,一切正常。谢谢你的帮助!
答案 0 :(得分:13)
您对应该的守护程序线程的理解是正确的。
至于为什么没有发生这种情况,我猜你正在使用旧版本的Python。 Python 2.5.4文档包括setDaemon(daemonic)
函数,以及isDaemon()
来检查线程是否是守护程序线程。 2.6文档用可直接修改的daemon
标志替换它们。
<强>参考文献:强>
http://docs.python.org/release/2.5.4/(未提及daemon
成员)
http://docs.python.org/release/2.6/library/threading.html(包括daemon
成员)
答案 1 :(得分:6)
出于好奇,你在运行什么操作系统和什么版本的python?
我在Mac OS X 10.5.8上使用Python 2.6.2。
当我运行你的脚本时,这就是我得到的:
bnash-macbook:Desktop bnash$ python daemon.py daemonic
__main__ start
Daemon :: 0
Daemon :: 1
Daemon :: 2
Daemon :: 3
Daemon :: 4
__main__ stop
Exception in thread Thread-1 (most likely raised during interpreter shutdown)
这看起来就像你期望的那样。
这是相应的非守护进程行为(直到我杀死进程):
bnash-macbook:Desktop bnash$ python daemon.py asdf
__main__ start
Non-Daemon :: 0
Non-Daemon :: 1
Non-Daemon :: 2
Non-Daemon :: 3
Non-Daemon :: 4
__main__ stop
Non-Daemon :: 5
Non-Daemon :: 6
Non-Daemon :: 7
Non-Daemon :: 8
Terminated
对我而言似乎正常。