Concurrency and Modules
Starting Threads
The threading module runs a target function on another thread. Replay records
which thread produced each trace event, then colors that activity in the same
source pane.
start and join
`start()` begins work on a new thread. `join()` waits until that thread has finished before the main thread continues.
Worker Function
thread_start_join.py
Replay: real traced execution (multi-file project)
import threading
def worker(name, limit):
for step in range(1, limit + 1):
message = name + ":" + str(step)
print(message)
limit = 2
alpha = threading.Thread(target=worker, args=("alpha", limit))
beta = threading.Thread(target=worker, args=("beta", limit))
alpha.start()
beta.start()
alpha.join()
beta.join()
print("done")
import threading
def worker(name, limit):
for step in range(1, limit + 1):
message = name + ":" + str(step)
print(message)
limit = 3
alpha = threading.Thread(target=worker, args=("alpha", limit))
beta = threading.Thread(target=worker, args=("beta", limit))
alpha.start()
beta.start()
alpha.join()
beta.join()
print("done")
limit ← 2, alpha ← <Thread(Thread-1 (worker), initial)>, beta ← <Thread(Thread-2 (worker), initial)>
10limit→ 2 = 2 #@limit=31112alpha→ <Thread(Thread-1 (worker), initial)> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Thread(target=worker⟨function worker A⟩, args=("alpha", limit2))13beta→ <Thread(Thread-2 (worker), initial)> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Thread(target=worker⟨function worker A⟩, args=("beta", limit2))1415alpha<Thread(Thread-1 (worker), initial)>.start()16beta.start()def worker(name, limit):
pass 1 of 24def worker(namealpha, limit2):5 for step in range(1, limit + 1):6 message = name + ":" + str(step)message ← alpha:1
pass 1 of 44def worker(name, limit):5 for step1 in range(1, limit2 + 1):6 message→ alpha:1 = namealpha + ":" + str(step1)7 print(messagealpha:1)outputalpha:1All 4 passes — pass 1 is the card above pass stepnamemessage1 1 alpha alpha:1 2 2 alpha alpha:2 3 1 beta beta:1 4 2 beta beta:2 alpha ← <Thread(Thread-1 (worker), stopped 136789851645632)>
15alpha→ <Thread(Thread-1 (worker), stopped 136789851645632)>.start()16beta<Thread(Thread-2 (worker), initial)>.start()17alpha.join()def worker(name, limit):
pass 2 of 24def worker(namebeta, limit2):5 for step in range(1, limit + 1):6 message = name + ":" + str(step)beta ← <Thread(Thread-2 (worker), stopped 136789851645632)>
15alpha.start()16beta→ <Thread(Thread-2 (worker), stopped 136789851645632)>.start()17alpha<Thread(Thread-1 (worker), stopped 136789851645632)>.join()18beta<Thread(Thread-2 (worker), stopped 136789851645632)>.join()1920print("done")outputdone
limit ← 3, alpha ← <Thread(Thread-1 (worker), initial)>, beta ← <Thread(Thread-2 (worker), initial)>
10limit→ 3 = 31112alpha→ <Thread(Thread-1 (worker), initial)> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Thread(target=worker⟨function worker A⟩, args=("alpha", limit3))13beta→ <Thread(Thread-2 (worker), initial)> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Thread(target=worker⟨function worker A⟩, args=("beta", limit3))1415alpha<Thread(Thread-1 (worker), initial)>.start()16beta.start()def worker(name, limit):
pass 1 of 24def worker(namealpha, limit3):5 for step in range(1, limit + 1):6 message = name + ":" + str(step)message ← alpha:1
pass 1 of 64def worker(name, limit):5 for step1 in range(1, limit3 + 1):6 message→ alpha:1 = namealpha + ":" + str(step1)7 print(messagealpha:1)outputalpha:1All 6 passes — pass 1 is the card above pass stepnamemessage1 1 alpha alpha:1 2 2 alpha alpha:2 3 3 alpha alpha:3 4 1 beta beta:1 5 2 beta beta:2 6 3 beta beta:3 alpha ← <Thread(Thread-1 (worker), stopped 130324468635328)>
15alpha→ <Thread(Thread-1 (worker), stopped 130324468635328)>.start()16beta<Thread(Thread-2 (worker), initial)>.start()17alpha.join()def worker(name, limit):
pass 2 of 24def worker(namebeta, limit3):5 for step in range(1, limit + 1):6 message = name + ":" + str(step)beta ← <Thread(Thread-2 (worker), stopped 130324468635328)>
15alpha.start()16beta→ <Thread(Thread-2 (worker), stopped 130324468635328)>.start()17alpha<Thread(Thread-1 (worker), stopped 130324468635328)>.join()18beta<Thread(Thread-2 (worker), stopped 130324468635328)>.join()1920print("done")outputdone