了解 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 成员)

【讨论】:

没有意识到 isDaemonsetDaemon 在 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 守护线程的主要内容,如果未能解决你的问题,请参考以下文章

Python线程:线程的调度-守护线程

python的守护线程(简介作用及代码实例)

一文搞懂│python 中守护线程与非守护线程

一文搞懂│python 中守护线程与非守护线程

一文搞懂│python 中守护线程与非守护线程

python基础-守护进程守护线程守护非守护并行