Подтвердить что ты не робот

Понимание потоков демона Python

Я, очевидно, неправильно понял что-то фундаментальное в отношении атрибута daemon объекта 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, и все работает нормально. Спасибо за помощь!

4b9b3361

Ответ 1

Ваше понимание того, что должны делать потоки демонов, является правильным.

Что касается того, почему этого не происходит, я предполагаю, что вы используете более старую версию 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)

Ответ 2

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

Я на Python 2.6.2 на Mac OS X 10.5.8.

Когда я запустил ваш script, вот что я получаю:

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

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