When writing programs, we often need a way to do multiple things simultaneously. An example of this is a web browser; if a page is taking forever to load, then users might open another tab and browse while they're waiting.
Threading is kind of like juggling:
where each ball is like a thread.
Below is a program that creates two threads that count, starting at zero. We start the second counter a second after the first one starts.
import threading
import time
class Counter:
def __init__(self, counter_num):
self.counter_num = counter_num
self.count = 0
def counting_thread(self):
while True:
print('Counter {0}: {1}'.format(self.counter_num, self.count))
self.count += 1
time.sleep(1)
def start(self):
thread = threading.Thread(target=self.counting_thread)
thread.start()
counter = Counter(1)
counter.start()
time.sleep(1)
counter2 = Counter(2)
counter2.start()
The output is:
Counter 1: 0
Counter 1: 1
Counter 2: 0
Counter 1: 2
Counter 2: 1
Counter 1: 3
Counter 2: 2
Counter 1: 4
Counter 2: 3
Counter 1: 5
Counter 2: 4
Both counters are going at the same time, and the program runs indefinitely.
The effects of Python's Global Interpreter Lock (GIL) are very important to understand. If you want to perform multiple processor-intensive tasks at once, you'll probably want to use multiprocessing. This is because the GIL limits your code to running on one thread. If you're doing things that won't fight for processing power, but instead are waiting tasks, such as requesting data from a server or waiting for the user to type something, then multi-threading is sufficient.
Leave a comment