Python Glossary English

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Сообщить о неточности