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

limit
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")
  1. 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()
  2. def worker(name, limit):

    pass 1 of 2
    4def worker(namealpha, limit2):5    for step in range(1, limit + 1):6        message = name + ":" + str(step)
  3. message ← alpha:1

    pass 1 of 4
    4def worker(name, limit):5    for step1 in range(1, limit2 + 1):6        message→ alpha:1 = namealpha + ":" + str(step1)7        print(messagealpha:1)
    outputalpha:1
    All 4 passes — pass 1 is the card above
    passstepnamemessage
    11alphaalpha:1
    22alphaalpha:2
    31betabeta:1
    42betabeta:2
  4. alpha ← <Thread(Thread-1 (worker), stopped 136789851645632)>

    15alpha→ <Thread(Thread-1 (worker), stopped 136789851645632)>.start()16beta<Thread(Thread-2 (worker), initial)>.start()17alpha.join()
  5. def worker(name, limit):

    pass 2 of 2
    4def worker(namebeta, limit2):5    for step in range(1, limit + 1):6        message = name + ":" + str(step)
  6. 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
  1. 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()
  2. def worker(name, limit):

    pass 1 of 2
    4def worker(namealpha, limit3):5    for step in range(1, limit + 1):6        message = name + ":" + str(step)
  3. message ← alpha:1

    pass 1 of 6
    4def worker(name, limit):5    for step1 in range(1, limit3 + 1):6        message→ alpha:1 = namealpha + ":" + str(step1)7        print(messagealpha:1)
    outputalpha:1
    All 6 passes — pass 1 is the card above
    passstepnamemessage
    11alphaalpha:1
    22alphaalpha:2
    33alphaalpha:3
    41betabeta:1
    52betabeta:2
    63betabeta:3
  4. alpha ← <Thread(Thread-1 (worker), stopped 130324468635328)>

    15alpha→ <Thread(Thread-1 (worker), stopped 130324468635328)>.start()16beta<Thread(Thread-2 (worker), initial)>.start()17alpha.join()
  5. def worker(name, limit):

    pass 2 of 2
    4def worker(namebeta, limit3):5    for step in range(1, limit + 1):6        message = name + ":" + str(step)
  6. 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