diff options
author | Guido van Rossum <guido@python.org> | 2013-11-23 23:09:16 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2013-11-23 23:09:16 (GMT) |
commit | 085869bfeeaeecaa79fd4ea9b55fc48f2fe08f05 (patch) | |
tree | bfa2ef89c711b62a56b004a90fdb6ff6810859b5 /Lib/asyncio | |
parent | dcd340eeebf0793ea0797ca90d72ac535db4ea78 (diff) | |
download | cpython-085869bfeeaeecaa79fd4ea9b55fc48f2fe08f05.zip cpython-085869bfeeaeecaa79fd4ea9b55fc48f2fe08f05.tar.gz cpython-085869bfeeaeecaa79fd4ea9b55fc48f2fe08f05.tar.bz2 |
asyncio: Change bounded semaphore into a subclass, like threading.[Bounded]Semaphore.
Diffstat (limited to 'Lib/asyncio')
-rw-r--r-- | Lib/asyncio/locks.py | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index dd9f0f8..4b0ce50 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -336,22 +336,15 @@ class Semaphore: Semaphores also support the context manager protocol. - The first optional argument gives the initial value for the internal + The optional argument gives the initial value for the internal counter; it defaults to 1. If the value given is less than 0, ValueError is raised. - - The second optional argument determines if the semaphore can be released - more than initial internal counter value; it defaults to False. If the - value given is True and number of release() is more than number of - successful acquire() calls ValueError is raised. """ - def __init__(self, value=1, bound=False, *, loop=None): + def __init__(self, value=1, *, loop=None): if value < 0: raise ValueError("Semaphore initial value must be >= 0") self._value = value - self._bound = bound - self._bound_value = value self._waiters = collections.deque() self._locked = (value == 0) if loop is not None: @@ -402,17 +395,9 @@ class Semaphore: """Release a semaphore, incrementing the internal counter by one. When it was zero on entry and another coroutine is waiting for it to become larger than zero again, wake up that coroutine. - - If Semaphore is created with "bound" parameter equals true, then - release() method checks to make sure its current value doesn't exceed - its initial value. If it does, ValueError is raised. """ - if self._bound and self._value >= self._bound_value: - raise ValueError('Semaphore released too many times') - self._value += 1 self._locked = False - for waiter in self._waiters: if not waiter.done(): waiter.set_result(True) @@ -429,3 +414,20 @@ class Semaphore: def __iter__(self): yield from self.acquire() return self + + +class BoundedSemaphore(Semaphore): + """A bounded semaphore implementation. + + This raises ValueError in release() if it would increase the value + above the initial value. + """ + + def __init__(self, value=1, *, loop=None): + self._bound_value = value + super().__init__(value, loop=loop) + + def release(self): + if self._value >= self._bound_value: + raise ValueError('BoundedSemaphore released too many times') + super().release() |