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)。

参数:
  • blocking (bool) -- 如果为真(默认值),则此函数将一直阻塞,直到获取信号量为止。

  • timeout (float) -- 如果给予,以及 舞台调度 为true,指定此方法将阻止的最大秒数。

返回:

A bool 指示是否获取了信号量。如果 blocking 是真的,而且 timeout 如果为“无”(默认值),则(只要此信号量是用大于0的大小初始化的),这将始终返回“真”。如果超时,并且在获取信号量之前过期,则返回false。(注意,这仍然可以提高 Timeout 异常,如果其他调用方已启动计时器。)

locked()#

返回一个布尔值,指示是否可以获取信号量 (False 如果信号灯 can 被收购)。对于二进制信号量(初始值为1的信号量)最有用。

返回类型:

bool

注册一个回调以便在该对象准备好时调用。

回调 将在 Hub ,因此它不能使用阻塞的gevent API。 回调 将传递一个参数:此实例。

ready()#

返回一个布尔值,指示是否可以获取信号量 (True 如果可以获取信号量)。

返回类型:

bool

release()#

喜欢 Semaphore.release() 但提高 ValueError 如果信号量被过度释放。

删除由设置的回调 rawlink()

wait(timeout=None)#

等待直到可以获取此信号量,或者直到可选的 超时 逝去。

备注

如果这个信号量是用 价值 如果没有超时,则此方法将永远阻塞。

参数:

timeout (float) -- 如果给定,则指定此方法将阻止的最大秒数。

返回:

一个数字,指示在阻塞之前可以获取信号量的次数。 可能是0, 如果其他服务员获得了信号量。

返回类型:

int

class DummySemaphore(value=None)[源代码]#

基类:object

具有与相同API的对象 Semaphore ,用“无限”初始值初始化。它的任何方法都不会阻塞。

这可用于参数化是否实际保护对潜在有限资源的访问。如果资源实际上是有限的,例如固定大小的线程池,请使用 Semaphore ,但如果资源未绑定,请使用此类的实例。这样就不需要更改任何支持代码。

同样,它可以用于参数化是否对某些基础对象强制互斥。如果底层对象本身是线程安全的,则不需要互斥,并且 DummySemaphore 可以使用,但如果不是这样,请使用 Semaphore .

在 1.1rc3 版本发生变更: 接受并忽略 价值 与信号量兼容的参数。

acquire(blocking=True, timeout=None)[源代码]#

DummySemaphore始终可以立即获取,因此它始终返回true并忽略其参数。

在 1.1a1 版本发生变更: 总是返回 true .

locked()[源代码]#

DummySemaphore永远不会被锁定,因此它总是返回false。

ready()[源代码]#

DummySemaphore从不被锁定,因此它总是返回True。

release()[源代码]#

释放一个虚拟信号量什么也不做。

wait(timeout=None)[源代码]#

等待一个dummesemaphore立即返回。

class RLock(hub=None)[源代码]#

基类:object

同一个greenlet可以多次获取的互斥体。

互斥锁一次只能被一个greenlet锁定。一个绿色的罐子 acquire 不过,互斥量可以根据需要进行多次。每次呼叫 acquire 必须与匹配的调用配对 release .

如果greenlet没有获得互斥体来释放它,这是一个错误。

实例是上下文管理器。

在 20.5.1 版本发生变更: 添加 hub 争论。

acquire(blocking=True, timeout=None)[源代码]#

获取互斥体,如果 舞台调度 是真的,最多 超时 秒。

在 1.5a4 版本发生变更: 增加了 超时 参数。

返回:

指示是否已获取互斥体的布尔值。

release()[源代码]#

释放互斥。

只有最初获得互斥体的greenlet才能释放它。

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)。

参数:
  • blocking (bool) -- 如果为真(默认值),则此函数将一直阻塞,直到获取信号量为止。

  • timeout (float) -- 如果给予,以及 舞台调度 为true,指定此方法将阻止的最大秒数。

返回:

A bool 指示是否获取了信号量。如果 blocking 是真的,而且 timeout 如果为“无”(默认值),则(只要此信号量是用大于0的大小初始化的),这将始终返回“真”。如果超时,并且在获取信号量之前过期,则返回false。(注意,这仍然可以提高 Timeout 异常,如果其他调用方已启动计时器。)

locked()[源代码]#

返回一个布尔值,指示是否可以获取信号量 (False 如果信号灯 can 被收购)。对于二进制信号量(初始值为1的信号量)最有用。

返回类型:

bool

注册一个回调以便在该对象准备好时调用。

回调 将在 Hub ,因此它不能使用阻塞的gevent API。 回调 将传递一个参数:此实例。

ready()[源代码]#

返回一个布尔值,指示是否可以获取信号量 (True 如果可以获取信号量)。

返回类型:

bool

release()#

释放信号量,如果需要,通知任何等待者。没有返回值。

备注

这可以用来过度释放信号量。(发布的次数超过了获得或最初创建时使用的次数。)

这通常是一个bug的迹象,但在某些情况下,可以故意使用它,例如,为额外资源的到达建模。

返回类型:

None

删除由设置的回调 rawlink()

wait(timeout=None)#

等待直到可以获取此信号量,或者直到可选的 超时 逝去。

备注

如果这个信号量是用 价值 如果没有超时,则此方法将永远阻塞。

参数:

timeout (float) -- 如果给定,则指定此方法将阻止的最大秒数。

返回:

一个数字,指示在阻塞之前可以获取信号量的次数。 可能是0, 如果其他服务员获得了信号量。

返回类型:

int