Python 3.4+Асинхронное программированиепонятие
asyncio.BoundedSemaphore
синхронизация
Семафор, который не даёт счётчику подняться выше начального значения: лишний release() бросает ValueError вместо того, чтобы молча пропустить лишнюю задачу.
Синтаксис
sem = asyncio.BoundedSemaphore(value=1)
Поведение при правильном использовании то же, что у asyncio.Semaphore, разница только в ошибке: Semaphore(2) после лишнего release() пустит трёх, а BoundedSemaphore(2) сразу скажет «released too many times». Поэтому для «не больше N одновременно» разумно брать именно его — ошибка в подсчёте видна сразу, а не через неделю под нагрузкой.
Примеры
import asyncio
async def main():
sem = asyncio.BoundedSemaphore(1)
async with sem:
await asyncio.sleep(0.01)
try:
sem.release() # лишний release
except ValueError as e:
print(e) # → BoundedSemaphore released too many times
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности