kopia lustrzana https://github.com/peterhinch/micropython-samples
38 wiersze
974 B
Python
38 wiersze
974 B
Python
![]() |
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')
|