我显然误解了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"
Run Code Online (Sandbox Code Playgroud)
从python文档:
当没有剩下活着的非守护程序线程时,整个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
Run Code Online (Sandbox Code Playgroud)
我得到了什么?
正如贾斯汀和布伦特所猜测的那样,我使用的是Python 2.5.刚刚回家并在我自己的机器上运行2.7,一切正常.谢谢你的帮助!
Jus*_*ini 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成员)
出于好奇,你在运行什么操作系统和什么版本的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)
Run Code Online (Sandbox Code Playgroud)
这看起来就像你期望的那样.
这是相应的非守护进程行为(直到我杀死进程):
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
Run Code Online (Sandbox Code Playgroud)
对我来说似乎很正常.
| 归档时间: |
|
| 查看次数: |
11091 次 |
| 最近记录: |