Python Daemon Threads

Summary: in this tutorial, you’ll learn about Python daemon threads and how to use them effectively.

Introduction to the Python daemon threads #

In Python, every program has at least one thread called the main thread. To create a program that has more than one thread, you use the threading module. By using multiple threads, you can execute tasks concurrently.

Sometimes, you may want to execute a task in the background. To do that you use a special kind of thread called a daemon thread.

By definition, daemon threads are background threads. In other words, daemon threads execute tasks in the background.

Daemon threads are helpful for executing tasks that support non-daemon threads in the program. For example:

  • Log information to a file in the background.
  • Scrap contents from a website in the background.
  • Auto-save the data into a database in the background.

Creating a daemon thread #

To create a daemon thread, you set the daemon to True in the Thread constructor:

t = Thread(target=f, deamon=True)

Alternatively, you can set the daemon property to True after creating the Thread‘s instance:

t = Thread(target=f)
t.deamon = True

A daemon thread example #

The following example shows how to create a non-daemon thread that shows the number of seconds that the program has been waiting for:

from threading import Thread
import time


def show_timer():
    count = 0
    while True:
        count += 1
        time.sleep(1)
        print(f'Has been waiting for {count} second(s)...')


t = Thread(target=show_timer)
t.start()

answer = input('Do you want to exit?\n')

How it works.

First, define a function show_timer() that displays the number of seconds that the program has been waiting for.

Second, create a new thread that executes the show_timer() function:

t = Thread(target=show_timer)

Third, start the thread:

t.start()

Finally, call the input() function to prompt users for input:

answer = input('Do you want to exit?\n')

If you run the program, it’ll show the following output and run forever.

Do you want to exit?Has been waiting for 1 second(s)...
Has been waiting for 2 second(s)...
Has been waiting for 3 second(s)...
Has been waiting for 4 second(s)...
Y
Has been waiting for 5 second(s)...
Has been waiting for 6 second(s)...

To terminate the program, you need to kill the terminal.

The program runs indefinitely because the thread t is a non-daemon thread. The program needs to wait for all non-daemon threads to complete before it can exit.

Now, let’s turn the thread into a daemon thread:

from threading import Thread
import time


def show_timer():
    count = 0
    while True:
        count += 1
        time.sleep(1)
        print(f'Has been waiting for {count} second(s)...')


t = Thread(target=show_timer, daemon=True)
t.start()

answer = input('Do you want to exit?\n')

If you run the program, input something, and hit enter, the program will terminate. For example:

Do you want to exit?
Has been waiting for 1 second(s)...
Y

The program terminates because it doesn’t need to wait for the daemon thread to complete. Also, the daemon thread is killed automatically when the program exits.

Daemon threads vs. non-daemon threads #

The following table illustrates the differences between daemon and non-daemon threads:

Daemon ThreadsNon-daemon Threads
Thread creationt = Thread(target=f, daemon=True)t = Thread(target=f)
The program needs to wait before exitingNoYes
Kind of tasksNot critical like loggingCritical

Summary #

  • A daemon thread is a background thread.
  • A daemon thread is useful for executing tasks that are not critical.
  • The program can exit and doesn’t need to wait for the daemon threads to be completed.
  • A daemon thread is automatically killed when the program exits.

Was this helpful?