Python 3.3+multiprocessingпонятие
multiprocessing.Barrier
синхронизация
Барьер между процессами: заданное число участников ждёт друг друга в wait() и проходит дальше одновременно. Появился в Python 3.3.
Синтаксис
b = ctx.Barrier(parties, action=None, timeout=None); b.wait(timeout=None)
Это копия threading.Barrier для процессов, и исключение у него то же — threading.BrokenBarrierError, а не что-то из multiprocessing. Если участник не дошёл (упал или его запустили меньше), остальные ждут вечно, поэтому задавайте timeout: по нему ломается весь барьер, и каждый следующий wait() тоже получает BrokenBarrierError до reset(). Главный процесс тоже может быть участником — учитывайте его в parties. Примитив передают ребёнку аргументом Process при создании; через Queue или аргументы Pool его не передать — RuntimeError «should only be shared between processes through inheritance».
Примеры
import multiprocessing as mp
def party(b):
b.wait(timeout=10)
if __name__ == '__main__':
ctx = mp.get_context('spawn')
b = ctx.Barrier(2) # участники: ребёнок и главный процесс
p = ctx.Process(target=party, args=(b,))
p.start()
b.wait(timeout=10)
print('both passed') # → both passed
p.join()
import multiprocessing as mp
import threading
if __name__ == '__main__':
b = mp.get_context('spawn').Barrier(2)
try:
b.wait(timeout=0.1) # второго участника нет
except threading.BrokenBarrierError:
print('broken:', b.broken) # → broken: True
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности