I've obviously misunderstood something fundamental about a Python Thread object's daemon attribute.
Consider the following:
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"
From the python docs:
The entire Python program exits when no alive non-daemon threads are left.
So if I run with TestThread as a daemon, I would expect it to exit once the main thread has completed. But this doesn't happen:
> python daemonic.py daemonic
__main__ start
Daemon :: 0
Daemon :: 1
Daemon :: 2
Daemon :: 3
Daemon :: 4
__main__ stop
Daemon :: 5
Daemon :: 6
^C
What don't I get?
As guessed by Justin and Brent, I was running with Python 2.5. Have just got home and tried out on my own machine running 2.7, and everything works fine. Thanks for your helps!
Your understanding about what daemon threads should do is correct.
As to why this isn't happening, I am guessing you are using an older version of Python. The Python 2.5.4 docs include a setDaemon(daemonic)
function, as well as isDaemon()
to check if a thread is a daemon thread. The 2.6 docs replace these with a directly modifiable daemon
flag.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With