Raise a threading event a fixed number of times and report whether the gate is open.

event flag A `threading.Event` keeps one shared flag, so counting how many times it is set gives a clear coordination signal that other workers could wait on.

Event Gate Coordination Report

raises
event_gate_coordination_report.py
Replay: real traced execution (multi-file project)
import threading


raises = 1
gate = threading.Event()
toggles = 0

for _ in range(raises):
    gate.set()
    toggles += 1

opened = gate.is_set()
status = "closed" if toggles == 0 else "open" if toggles == 1 else "latched"

print("raises=" + str(raises) + " toggles=" + str(toggles) + " open=" + str(opened) + " status=" + status)
import threading


raises = 0
gate = threading.Event()
toggles = 0

for _ in range(raises):
    gate.set()
    toggles += 1

opened = gate.is_set()
status = "closed" if toggles == 0 else "open" if toggles == 1 else "latched"

print("raises=" + str(raises) + " toggles=" + str(toggles) + " open=" + str(opened) + " status=" + status)
import threading


raises = 2
gate = threading.Event()
toggles = 0

for _ in range(raises):
    gate.set()
    toggles += 1

opened = gate.is_set()
status = "closed" if toggles == 0 else "open" if toggles == 1 else "latched"

print("raises=" + str(raises) + " toggles=" + str(toggles) + " open=" + str(opened) + " status=" + status)
  1. raises ← 1, gate ← <threading.Event at ⟨addr A⟩: unset>, toggles ← 0

    4raises→ 1 = 1  #@raises=0, 25gate→ <threading.Event at ⟨addr A⟩: unset> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Event()6toggles→ 0 = 0
  2. gate ← <threading.Event at ⟨addr A⟩: set>, toggles ← 1

    8for _0 in range(raises1):9    gate→ <threading.Event at ⟨addr A⟩: set>.set()10    toggles→ 1 += 1
  3. opened ← True, status ← open

    12opened→ True = gate<threading.Event at ⟨addr A⟩: set>.is_set()13status→ open = "closed" if toggles1 == 0 else "open" if toggles == 1 else "latched"1415print("raises=" + str(raises1) + " toggles=" + str(toggles1) + " open=" + str(openedTrue) + " status=" + statusopen)
    outputraises=1 toggles=1 open=True status=open
  1. raises ← 0, gate ← <threading.Event at ⟨addr A⟩: unset>, toggles ← 0

    4raises→ 0 = 05gate→ <threading.Event at ⟨addr A⟩: unset> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Event()6toggles→ 0 = 078for _ in range(raises):9    gate.set()10    toggles += 11112opened→ False = gate<threading.Event at ⟨addr A⟩: unset>.is_set()13status→ closed = "closed" if toggles0 == 0 else "open" if toggles == 1 else "latched"1415print("raises=" + str(raises0) + " toggles=" + str(toggles0) + " open=" + str(openedFalse) + " status=" + statusclosed)
    outputraises=0 toggles=0 open=False status=closed
  1. raises ← 2, gate ← <threading.Event at ⟨addr A⟩: unset>, toggles ← 0

    4raises→ 2 = 25gate→ <threading.Event at ⟨addr A⟩: unset> = threading<module 'threading' from '/usr/local/lib/python3.12/threading.py'>.Event()6toggles→ 0 = 0
  2. gate ← <threading.Event at ⟨addr A⟩: set>, toggles ← 1

    pass 1 of 2
    8for _0 in range(raises2):9    gate→ <threading.Event at ⟨addr A⟩: set>.set()10    toggles→ 1 += 1
  3. toggles ← 2

    pass 2 of 2
    8for _1 in range(raises2):9    gate<threading.Event at ⟨addr A⟩: set>.set()10    toggles→ 2 += 1
  4. opened ← True, status ← latched

    12opened→ True = gate<threading.Event at ⟨addr A⟩: set>.is_set()13status→ latched = "closed" if toggles2 == 0 else "open" if toggles == 1 else "latched"1415print("raises=" + str(raises2) + " toggles=" + str(toggles2) + " open=" + str(openedTrue) + " status=" + statuslatched)
    outputraises=2 toggles=2 open=True status=latched