Python Glossary English

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