gevent.lock
--锁定原语#
锁定基元。
其中包括具有任意边界的信号量 (Semaphore
以及它更安全的子类 BoundedSemaphore
)还有一个无限界的信号量 (DummySemaphore
),以及一个可重入的锁 (RLock
)具有与相同的API threading.RLock
.
- class BoundedSemaphore(value=1)#
基类:
_AtomicSemaphoreMixin
,BoundedSemaphore
有界信号量检查以确保其当前值不超过其初始值。如果是这样,
ValueError
被提升。在大多数情况下,信号量用于保护容量有限的资源。如果信号量被释放太多次,这是一个错误的迹象。如果没有给出, 价值 默认值为1。
- acquire(blocking=True, timeout=None) bool #
获取信号量。
备注
如果这个信号量是用 价值 对于0,此方法将永远阻塞(除非指定了超时或blocking设置为false)。
- release()#
喜欢
Semaphore.release()
但提高ValueError
如果信号量被过度释放。
- class DummySemaphore(value=None)[源代码]#
基类:
object
具有与相同API的对象
Semaphore
,用“无限”初始值初始化。它的任何方法都不会阻塞。这可用于参数化是否实际保护对潜在有限资源的访问。如果资源实际上是有限的,例如固定大小的线程池,请使用
Semaphore
,但如果资源未绑定,请使用此类的实例。这样就不需要更改任何支持代码。同样,它可以用于参数化是否对某些基础对象强制互斥。如果底层对象本身是线程安全的,则不需要互斥,并且
DummySemaphore
可以使用,但如果不是这样,请使用Semaphore
.在 1.1rc3 版本发生变更: 接受并忽略 价值 与信号量兼容的参数。
- class RLock(hub=None)[源代码]#
基类:
object
同一个greenlet可以多次获取的互斥体。
互斥锁一次只能被一个greenlet锁定。一个绿色的罐子
acquire
不过,互斥量可以根据需要进行多次。每次呼叫acquire
必须与匹配的调用配对release
.如果greenlet没有获得互斥体来释放它,这是一个错误。
实例是上下文管理器。
在 20.5.1 版本发生变更: 添加
hub
争论。
- class Semaphore(value=1)#
基类:
_AtomicSemaphoreMixin
,Semaphore
参见
BoundedSemaphore
为了一个更安全的版本来防止某些类型的错误。如果不确定,大多数用户应该选择BoundedSemaphore
.信号量管理一个表示
release
呼叫数减去acquire
调用,加上初始值。这个acquire
方法将在必要时阻塞,直到它可以返回而不使计数器为负数。信号量不跟踪greenlet的所有权;任何greenlet都可以调用release
,无论它以前是否调用过acquire
.如果没有给出,
value
默认值为1。信号量是上下文管理器,可以在
with
声明。这个信号灯是
__exit__
方法不在cpython上调用跟踪函数,但在pypy下调用。在 1.4.0 版本发生变更: 没有指定唤醒服务员的顺序的文件。之前并没有具体说明,但由于CPython的实现异常通常按FIFO顺序进行。
在 1.5a3 版本发生变更: 等待中的小菜现在按照等待的顺序被唤醒。
在 1.5a3 版本发生变更: 低层
rawlink
方法(大多数用户不会使用此方法)现在在调用等待者之前自动取消其链接。在 20.12.0 版本发生变更: 改进了对多线程使用的支持。当检测到多线程使用时,如果线程的集线器不存在,则实例将不再创建该线程的集线器。
在 24.2.1 版本发生变更: 使用Python3本机锁定超时进行跨线程操作,而不是旋转。
- acquire(blocking=True, timeout=None) bool #
获取信号量。
备注
如果这个信号量是用 价值 对于0,此方法将永远阻塞(除非指定了超时或blocking设置为false)。
- release()#
释放信号量,如果需要,通知任何等待者。没有返回值。
备注
这可以用来过度释放信号量。(发布的次数超过了获得或最初创建时使用的次数。)
这通常是一个bug的迹象,但在某些情况下,可以故意使用它,例如,为额外资源的到达建模。
- 返回类型:
None