diff --git a/PFERD/limiter.py b/PFERD/limiter.py new file mode 100644 index 0000000..f73e2cd --- /dev/null +++ b/PFERD/limiter.py @@ -0,0 +1,19 @@ +import asyncio +from contextlib import AbstractAsyncContextManager, asynccontextmanager +from typing import AsyncIterator + + +class Limiter: + def __init__(self, limit: int = 10): + self._semaphore = asyncio.Semaphore(limit) + + @asynccontextmanager + async def _context_manager(self) -> AsyncIterator[None]: + await self._semaphore.acquire() + try: + yield + finally: + self._semaphore.release() + + def limit(self) -> AbstractAsyncContextManager[None]: + return self._context_manager()