try: import uasyncio as asyncio except ImportError: import asyncio # A Semaphore is typically used to limit the number of coros running a # particular piece of code at once. The number is defined in the constructor. class Semaphore(): def __init__(self, value=1): self._count = value async def __aenter__(self): await self.acquire() return self async def __aexit__(self, *args): self.release() await asyncio.sleep(0) async def acquire(self): while self._count == 0: await asyncio.sleep_ms(0) self._count -= 1 def release(self): self._count += 1 class BoundedSemaphore(Semaphore): def __init__(self, value=1): super().__init__(value) self._initial_value = value def release(self): if self._count < self._initial_value: self._count += 1 else: raise ValueError('Semaphore released more than acquired')