2010-08-12 187 views
10

我明顯誤解了Python Thread對象的守護進程屬性的基本原理。瞭解Python守護進程線程

考慮以下幾點:

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 

我得不到什麼?


正如賈斯汀和布倫特所猜測的那樣,我是用Python 2.5運行的。剛剛回家,並嘗試在我自己的機器上運行2.7,並且一切正常。感謝您的幫助!

回答

12

你瞭解什麼守護線程應該做的是正確的。

至於爲什麼沒有發生這種情況,我猜你正在使用舊版本的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成員)

+0

沒有意識到'isDaemon'和'setDaemon'在2.7中已經被棄用了。很高興知道。 – 2010-08-12 17:43:32

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 

似乎只要正常給我。