Search code examples
pythonmultithreadingdaemon

Python daemon thread does not exit when parent thread exits


I have some Python code that creates a demon thread. The parent thread ends almost immediately, but the daemon thread keeps printing sleep.

import threading
import time
def int_sleep():
    for _ in range(1, 600):
        time.sleep(1)
        print("sleep")

def main():
    thread = threading.Thread(target=int_sleep)
    thread.daemon = True
    thread.start()
    time.sleep(2)
    print("main thread end...")

thread = threading.Thread(target=main)
thread.start()

sys.version:

'3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)]'

Prints:

sleep

main thread end...

sleep

sleep

sleep

Why doesn't the Python daemon thread exit when parent thread exits?


Solution

  • If you specify thread.daemon = True for your python thread, then the program will halt immediately when only the daemon is left. The the commands sent to stdout are lost.

    Add this to a file called main.py

    import threading
    import time
    
    def int_sleep():
      for _ in range(1, 600):
        time.sleep(1)
        print("sleep")
    
    def main():
      thread = threading.Thread(target=int_sleep)
      thread.daemon = True
      thread.start()
      time.sleep(2)
      print("main thread end...")
    
    thread = threading.Thread(target=main)
    thread.daemon = True
    thread.start()
    

    Run it like this:

    el@apollo:~/code/python/run01$ python --version
    Python 2.7.6
    el@apollo:~$ python main.py 
    el@apollo:~$
    

    See it prints nothing because the thread started. You set it to be a daemon and started it. Then the program ended.

    Extra notes: If you paste this code into a python interpreter, all the print statements will appear on the terminal because the daemon never loses hold of its connection to stdout.

    Read more: http://docs.python.org/2/library/threading.html