2010-08-12 5 views
10

Я, очевидно, неправильно понял что-то фундаментальное в атрибуте daemon объекта Thread Python.Понимание потоков демона 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, когда нет в живых, не демон потоки не осталось.

Так что, если я запускаю 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 docs заменяют их прямым модифицируемым флагом 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. Хорошо знать. –

6

Просто из любопытства, какая ОС и какая версия Python вы используете?

Я нахожусь на Python 2.6.2 на Mac OS X 10.5.8.

Когда я запускаю сценарий, вот что я получаю:

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 

Кажется достаточно нормальным для меня.

Смежные вопросы