Я, очевидно, неправильно понял что-то фундаментальное об атрибуте демона объекта Потока 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, и все хорошо работает. Спасибо за Ваш помогает!
Ваше понимание того, что потоки демонов должны делать, верно.
Что касается того, почему этого не происходит, я предполагаю, что вы используете более старую версию 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)
Просто из любопытства, какая у вас ОС и какая версия 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
Мне кажется достаточно нормальным.