代码之家  ›  专栏  ›  技术社区  ›  grifaton

了解Python守护进程线程

  •  11
  • grifaton  · 技术社区  · 16 年前

    考虑以下几点:

    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
    

    我还不明白什么?


    2 回复  |  直到 16 年前
        1
  •  13
  •   Justin Ardini    16 年前

    应该

    setDaemon(daemonic) 功能,以及 isDaemon() 检查线程是否是守护进程线程。2.6文档用可直接修改的 daemon

    参考文献:

    http://docs.python.org/release/2.5.4/ 守护进程 (提及成员)

    http://docs.python.org/release/2.6/library/threading.html (包括 守护进程 (成员)

        2
  •  6
  •   Brent Writes Code    16 年前

    我使用的是MacOSX10.5.8上的Python2.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
    

    我觉得很正常。