Files
2026-10-07 13:06:47 +05:00

39 lines
1.4 KiB
Python

# -*- coding: utf-8 -*-
"""Демо: asyncio.Semaphore — ограничение конкурентности.
Запуск из корня курса:
python lab06_asyncio/examples/03_semaphore_demo.py
50 «запросов», сервер выдерживает 5 одновременных. Семафор не даёт
превысить лимит: время ≈ 50/5 × delay.
"""
import asyncio
import time
async def request(i: int, delay: float) -> int:
await asyncio.sleep(delay)
return i
async def bounded(i: int, delay: float, sem: asyncio.Semaphore) -> int:
async with sem: # только 5 корутин внутри одновременно
return await request(i, delay)
async def main():
N, DELAY, LIMIT = 50, 0.05, 5
sem = asyncio.Semaphore(LIMIT)
t0 = time.perf_counter()
results = await asyncio.gather(*(bounded(i, DELAY, sem)
for i in range(N)))
dt = time.perf_counter() - t0
print(f"{N} запросов, лимит {LIMIT}: {dt:.2f} c")
print(f"идеал ≈ {N / LIMIT * DELAY:.2f} c")
print(f"результаты упорядочены: {results == list(range(N))}")
print("\nБез семафора было бы ≈ 0.05 c (все сразу) — но так сервер ляжет.")
if __name__ == "__main__":
asyncio.run(main())