了解 Python 守护线程
Posted
技术标签:
【中文标题】了解 Python 守护线程【英文标题】:Understanding Python daemon threads 【发布时间】:2010-08-12 17:11:09 【问题描述】:我显然误解了 Python Thread 对象的 daemon 属性的基本原理。
考虑以下几点:
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 文档:
整个 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
我没有得到什么?
正如 Justin 和 Brent 所猜测的那样,我使用的是 Python 2.5。刚回到家并在我自己的运行 2.7 的机器上试用,一切正常。感谢您的帮助!
【问题讨论】:
【参考方案1】:您对守护线程应该做什么的理解是正确的。
至于为什么没有发生这种情况,我猜你使用的是旧版本的 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
成员)
【讨论】:
没有意识到isDaemon
和 setDaemon
在 2.7 中已被弃用。很高兴知道。【参考方案2】:
出于好奇,您运行的是什么操作系统和什么版本的 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
对我来说似乎很正常。
【讨论】:
以上是关于了解 Python 守护线程的主要内容,如果未能解决你的问题,请参考以下文章