# -*- 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())