了解Python守护程序线程

时间:2010-08-12 17:11:10

标签: python

我显然误解了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,一切正常。谢谢你的帮助!

2 个答案:

答案 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

对我而言似乎正常。