Concurrency Coordination Reports
Event Gate Coordination Report
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
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)
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 = 0gate ← <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 += 1opened ← 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
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
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 = 0gate ← <threading.Event at ⟨addr A⟩: set>, toggles ← 1
pass 1 of 28for _0 in range(raises2):9 gate→ <threading.Event at ⟨addr A⟩: set>.set()10 toggles→ 1 += 1toggles ← 2
pass 2 of 28for _1 in range(raises2):9 gate<threading.Event at ⟨addr A⟩: set>.set()10 toggles→ 2 += 1opened ← 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