Python 3.4+Асинхронное программированиепонятие
asyncio.Semaphore
синхронизация
Счётчик разрешений: пропускает в блок async with не больше N задач одновременно. Типичное применение — ограничить число одновременных запросов.
Синтаксис
sem = asyncio.Semaphore(value=1)
async with sem: ...
Семафор ограничивает одновременность, а не скорость: задачи всё равно создаются все сразу и ждут своей очереди внутри, так что тысячи корутин в gather() по-прежнему занимают память. Лишний release() без acquire() молча увеличивает счётчик выше начального — ошибка в логике пропустит больше задач, чем задумано; чтобы такое ловить, есть asyncio.BoundedSemaphore.
Примеры
import asyncio
active = 0
peak = 0
async def job(sem):
global active, peak
async with sem:
active += 1
peak = max(peak, active)
await asyncio.sleep(0.01)
active -= 1
async def main():
sem = asyncio.Semaphore(2)
await asyncio.gather(*(job(sem) for _ in range(6)))
print(peak) # → 2 — больше двух одновременно не было
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности