【问题标题】:Understanding Python daemon threads了解 Python 守护线程
【发布时间】: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 的机器上试用,一切正常。感谢您的帮助!

【问题讨论】:

    标签: python


    【解决方案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
    

    对我来说似乎很正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多