Python 3.2+threadingпонятие
threading.Barrier
синхронизация
Барьер: заданное число потоков ждёт друг друга в wait() и проходит дальше одновременно — общая «стартовая линия» перед следующей фазой работы.
Синтаксис
barrier = threading.Barrier(parties, action=None, timeout=None)
index = barrier.wait(timeout=None)
Барьер открывается, только когда в wait() пришли ровно parties потоков: если один упал или их запустили меньше, остальные висят вечно, поэтому задавайте timeout. По таймауту ломается весь барьер: все ждущие и все последующие wait() получают BrokenBarrierError, пока не вызвать reset(). wait() возвращает каждому потоку свой номер от 0 до parties-1 — так ровно один поток может сделать общую работу (то же умеет параметр action). В отличие от Event, барьер многоразовый: после прохода он сам готов к следующему кругу.
Примеры
import threading
barrier = threading.Barrier(3)
lock = threading.Lock()
log, numbers = [], []
def worker(name):
with lock:
log.append('ready')
n = barrier.wait()
with lock:
log.append('go')
numbers.append(n)
threads = [threading.Thread(target=worker, args=(c,)) for c in 'abc']
for t in threads:
t.start()
for t in threads:
t.join()
print(log[:3], sorted(numbers)) # → ['ready', 'ready', 'ready'] [0, 1, 2]
import threading
barrier = threading.Barrier(2, timeout=0.1)
try:
barrier.wait() # второй участник так и не пришёл
except threading.BrokenBarrierError:
print('broken:', barrier.broken) # → broken: True
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности