Python Glossary English

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