Понимание потоков демона 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:

Вся программа 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, и все хорошо работает. Спасибо за Ваш помогает!

11
задан grifaton 12 August 2010 в 17:59
поделиться

2 ответа

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

Что касается того, почему этого не происходит, я предполагаю, что вы используете более старую версию Python. Документация Python 2.5.4 включает функцию setDaemon(daemonic), а также isDaemon() для проверки, является ли поток потоком-демоном. В документации 2.6 они заменены на изменяемый напрямую флаг daemon.

References:

http://docs.python.org/release/2.5.4/ (no daemon member mentioned)

http://docs.python.org/release/2.6/library/threading.html (includes daemon member)

13
ответ дан 3 December 2019 в 06:19
поделиться

Просто из любопытства, какая у вас ОС и какая версия 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

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

6
ответ дан 3 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: