oursolutionarchitectoursolutionarchitect
  • Python Questions and Answers
  • Python - Programming Examples
  • Python - Quick Guide
  • Python - Useful Resources
  • Python - Discussion
    • Selected Reading
    • Q&A

    Python - Daemon Threads


    Sometimes, it is necessary to execute a task in the background. A special type of thread is used for background tasks, called a daemon thread. In other words, daemon threads execute tasks in the background.

    It may be noted that daemon threads execute such non-critical tasks that although may be useful to the application but do not hamper it if they fail or are canceled mid-operation.

    Also, a daemon thread will not have control over when it is terminated. The program will terminate once all non-daemon threads finish, even if there are daemon threads still running at that point of time.

    This is a major difference between daemon threads and non-daemon threads. The process will exit if only daemon threads are running, whereas it cannot exit if at least one non-daemon thread is running.

    Daemon Non-daemon
    A process will exit if only daemon threads are running (or if no threads are running). A process will not exit if at least one non-daemon thread is running.

    Creating a Daemon Thread

    To create a daemon thread, you need to set the daemon property to True.

    t1=threading.Thread(daemon=True)
    

    If a thread object is created without any parameter, its daemon property can also be set to True, before calling the start() method.

    t1=threading.Thread()
    t1.daemon=True
    

    Example

    Take a look at the following example −

    from time import sleep
    from threading import current_thread
    from threading import Thread
    
    # function to be executed in a new thread
    def run():
    
       # get the current thread
       thread = current_thread()
       # is it a daemon thread?
       print(f'Daemon thread: {thread.daemon}')
    
    # create a new thread
    thread = Thread(target=run, daemon=True)
    
    # start the new thread
    thread.start()
    
    # block for a 0.5 sec for daemon thread to run
    sleep(0.5)
    

    It will produce the following output

    Daemon thread: True
    

    Daemon threads can perform executing tasks that support non-daemon threads in the program. For example −

    • Create a file that stores Log information in the background.

    • Perform web scraping in the background.

    • Save the data automatically into a database in the background.

    Example

    If a running thread is configured to be daemon, then a RuntimeError is raised. Take a look at the following example −

    from time import sleep
    from threading import current_thread
    from threading import Thread
    
    # function to be executed in a new thread
    def run():
       # get the current thread
       thread = current_thread()
       # is it a daemon thread?
       print(f'Daemon thread: {thread.daemon}')
       thread.daemon = True
       
    # create a new thread
    thread = Thread(target=run)
    
    # start the new thread
    thread.start()
    
    # block for a 0.5 sec for daemon thread to run
    sleep(0.5)
    

    It will produce the following output

    Exception in thread Thread-1 (run):
    Traceback (most recent call last):
    . . . .
    . . . .
       thread.daemon = True
       ^^^^^^^^^^^^^
     File "C:\Python311\Lib\threading.py", line 1219, in daemon
      raise RuntimeError("cannot set daemon status of active thread")
    RuntimeError: cannot set daemon status of active thread