Python Glossary English

Python 3.11+Асинхронное программированиепонятие

asyncio.Barrier

синхронизация

Барьер: задачи ждут await barrier.wait(), пока их не наберётся заданное число parties, и только тогда продолжают все вместе. Появился в Python 3.11.

Синтаксис

barrier = asyncio.Barrier(parties); index = await barrier.wait()

Барьер многоразовый: после того как партия прошла, он снова ждёт parties задач. Если задач меньше, чем parties, ожидающие висят вечно, — поэтому wait() стоит обернуть в asyncio.timeout(). Отмена ждущей задачи барьер не ломает — она просто выходит, и ждущих становится меньше; ломает его barrier.abort(), и тогда все ждущие получают asyncio.BrokenBarrierError. wait() возвращает номер от 0 до parties-1 — удобно, чтобы ровно одна задача выполнила общий шаг.

Примеры

import asyncio
async def worker(name, barrier):
    await asyncio.sleep(0.01)
    index = await barrier.wait()
    if index == 0:
        print('все на месте')  # → все на месте
async def main():
    barrier = asyncio.Barrier(3)
    await asyncio.gather(*(worker(n, barrier) for n in 'abc'))
    print(barrier.parties, barrier.n_waiting)  # → 3 0
asyncio.run(main())

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности