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