gevent.lock
– Locking primitives#
Locking primitives.
These include semaphores with arbitrary bounds (Semaphore
and
its safer subclass BoundedSemaphore
) and a semaphore with
infinite bounds (DummySemaphore
), along with a reentrant lock
(RLock
) with the same API as threading.RLock
.
- class BoundedSemaphore(value=1)#
Bases:
_AtomicSemaphoreMixin
,BoundedSemaphore
A bounded semaphore checks to make sure its current value doesn’t exceed its initial value. If it does,
ValueError
is raised. In most situations semaphores are used to guard resources with limited capacity. If the semaphore is released too many times it’s a sign of a bug.If not given, value defaults to 1.
- acquire(blocking=True, timeout=None) bool #
Acquire the semaphore.
Note
If this semaphore was initialized with a value of 0, this method will block forever (unless a timeout is given or blocking is set to false).
- Parameters:
- Returns:
A
bool
indicating whether the semaphore was acquired. Ifblocking
is True andtimeout
is None (the default), then (so long as this semaphore was initialized with a size greater than 0) this will always return True. If a timeout was given, and it expired before the semaphore was acquired, False will be returned. (Note that this can still raise aTimeout
exception, if some other caller had already started a timer.)
- locked()#
Return a boolean indicating whether the semaphore can be acquired (
False
if the semaphore can be acquired). Most useful with binary semaphores (those with an initial value of 1).- Return type:
- rawlink(callback)#
Register a callback to call when this object is ready.
callback will be called in the
Hub
, so it must not use blocking gevent API. callback will be passed one argument: this instance.
- ready()#
Return a boolean indicating whether the semaphore can be acquired (
True
if the semaphore can be acquired).- Return type:
- release()#
Like
Semaphore.release()
, but raisesValueError
if the semaphore is being over-released.
- wait(timeout=None)#
Wait until it is possible to acquire this semaphore, or until the optional timeout elapses.
Note
If this semaphore was initialized with a value of 0, this method will block forever if no timeout is given.
- class DummySemaphore(value=None)[source]#
Bases:
object
An object with the same API as
Semaphore
, initialized with “infinite” initial value. None of its methods ever block.This can be used to parameterize on whether or not to actually guard access to a potentially limited resource. If the resource is actually limited, such as a fixed-size thread pool, use a real
Semaphore
, but if the resource is unbounded, use an instance of this class. In that way none of the supporting code needs to change.Similarly, it can be used to parameterize on whether or not to enforce mutual exclusion to some underlying object. If the underlying object is known to be thread-safe itself mutual exclusion is not needed and a
DummySemaphore
can be used, but if that’s not true, use a realSemaphore
.Changed in version 1.1rc3: Accept and ignore a value argument for compatibility with Semaphore.
- class RLock(hub=None)[source]#
Bases:
object
A mutex that can be acquired more than once by the same greenlet.
A mutex can only be locked by one greenlet at a time. A single greenlet can
acquire
the mutex as many times as desired, though. Each call toacquire
must be paired with a matching call torelease
.It is an error for a greenlet that has not acquired the mutex to release it.
Instances are context managers.
Changed in version 20.5.1: Add the
hub
argument.
- class Semaphore(value=1)#
Bases:
_AtomicSemaphoreMixin
,Semaphore
See also
BoundedSemaphore
for a safer version that prevents some classes of bugs. If unsure, most users should opt forBoundedSemaphore
.A semaphore manages a counter representing the number of
release
calls minus the number ofacquire
calls, plus an initial value. Theacquire
method blocks if necessary until it can return without making the counter negative. A semaphore does not track ownership by greenlets; any greenlet can callrelease
, whether or not it has previously calledacquire
.If not given,
value
defaults to 1.The semaphore is a context manager and can be used in
with
statements.This Semaphore’s
__exit__
method does not call the trace function on CPython, but does under PyPy.Changed in version 1.4.0: Document that the order in which waiters are awakened is not specified. It was not specified previously, but due to CPython implementation quirks usually went in FIFO order.
Changed in version 1.5a3: Waiting greenlets are now awakened in the order in which they waited.
Changed in version 1.5a3: The low-level
rawlink
method (most users won’t use this) now automatically unlinks waiters before calling them.Changed in version 20.12.0: Improved support for multi-threaded usage. When multi-threaded usage is detected, instances will no longer create the thread’s hub if it’s not present.
- acquire(blocking=True, timeout=None) bool #
Acquire the semaphore.
Note
If this semaphore was initialized with a value of 0, this method will block forever (unless a timeout is given or blocking is set to false).
- Parameters:
- Returns:
A
bool
indicating whether the semaphore was acquired. Ifblocking
is True andtimeout
is None (the default), then (so long as this semaphore was initialized with a size greater than 0) this will always return True. If a timeout was given, and it expired before the semaphore was acquired, False will be returned. (Note that this can still raise aTimeout
exception, if some other caller had already started a timer.)
- locked()[source]#
Return a boolean indicating whether the semaphore can be acquired (
False
if the semaphore can be acquired). Most useful with binary semaphores (those with an initial value of 1).- Return type:
- rawlink(callback)#
Register a callback to call when this object is ready.
callback will be called in the
Hub
, so it must not use blocking gevent API. callback will be passed one argument: this instance.
- ready()[source]#
Return a boolean indicating whether the semaphore can be acquired (
True
if the semaphore can be acquired).- Return type:
- release()#
Release the semaphore, notifying any waiters if needed. There is no return value.
Note
This can be used to over-release the semaphore. (Release more times than it has been acquired or was initially created with.)
This is usually a sign of a bug, but under some circumstances it can be used deliberately, for example, to model the arrival of additional resources.
- Return type:
None
- wait(timeout=None)#
Wait until it is possible to acquire this semaphore, or until the optional timeout elapses.
Note
If this semaphore was initialized with a value of 0, this method will block forever if no timeout is given.