Introduction to multithreading in Python
A Python application runs on a single thread, unless you explicitly enable multithreading.
Why is multithreading useful? Code in Python is ran in sequence, one instruction after another.
If you define a function that sleeps 3 seconds and then prints something, like this:
import time
def greet():
time.sleep(3)
print('hello')
greet()
print('world')
The world
string is printed after 3 seconds, because we call time.sleep(3)
inside the greet()
function.
This is just a silly example, but imagine processing an image, getting a resource from the network, or writing a big file to disk. Anything that can take a lot of time.
With multithreading we can run the function that takes a lot of time into a separate thread, and go on with our program in the meantime.
The threading
standard library module helps with implementing multithreading. You import Thread
from it:
from threading import Thread
Then we pass the function we must execute as the target
argument to the Thread()
function, getting a thread object:
t = Thread(target=greet)
then we call its start() method to start the thread:
t.start()
Try running this code:
from threading import Thread
import time
def greet():
time.sleep(3)
print('hello')
t = Thread(target=greet)
t.start()
print('world')
You will now see world
printed 3 seconds before hello
shows up in the console.
The program does not end until the thread (or all the threads it started) end, unless you start a thread as a deamon.
Those are the basics of multithreading. This is complex, and can lead to the introduction of bugs if not done well.
→ I wrote 17 books to help you become a better developer, download them all at $0 cost by joining my newsletter
→ JOIN MY CODING BOOTCAMP, an amazing cohort course that will be a huge step up in your coding career - covering React, Next.js - next edition February 2025