Barrier.abort marks a rendezvous as broken and releases current and future waiters with BrokenBarrierError.
Make this comfortable
Python threading.Barrier: abort a failed phase so peers do not wait forever
Observed contract
A worker announces that it is entering a phase gate. The owner aborts the gate to represent a failed peer. Whether the worker reached wait just before or after abort, it receives the same broken-barrier outcome; a later wait also fails.
Boundary
A barrier coordinates a known number of threads; it does not cancel their underlying work. Resetting while peer state is uncertain can mix phases. This program creates one barrier, aborts it once, and joins its owned worker.
Executable case
from threading import Barrier, BrokenBarrierError, Event, Thread
phase_gate = Barrier(2)
worker_entered = Event()
worker_outcomes = []
def await_receipt_phase():
worker_entered.set()
try:
phase_gate.wait(timeout=2)
except BrokenBarrierError:
worker_outcomes.append("released")
worker = Thread(target=await_receipt_phase)
worker.start()
if not worker_entered.wait(timeout=2):
raise TimeoutError("worker did not start")
phase_gate.abort()
worker.join(timeout=2)
if worker.is_alive():
raise TimeoutError("worker did not stop")
print("worker", worker_outcomes)
try:
phase_gate.wait(timeout=2)
except BrokenBarrierError:
print("later_wait_rejected", True)
print("broken", phase_gate.broken)Output
worker ['released']
later_wait_rejected True
broken TrueCost
A barrier maintains shared phase state and blocks each arrival until all parties appear or the phase breaks. Timeouts and abort paths need explicit owners, or a missing worker can strand the rest.
Common Mistakes
- An Event does not replace a barrier when every peer must reach a phase.
- Aborting a barrier does not stop work outside wait().
- Do not reset a broken barrier while peer phases are unknown.
Connected lessons
python
thread-barrier-abort
