gevent.event --多个侦听器的通知#

class Event[源代码]#

基类:AbstractLinkable

允许一个greenlet唤醒另一个或多个greenlet的同步原语。它的接口与 threading.Event 但在绿叶树上却起作用。

重要

此对象用于在同一线程内的greenlet之间进行通信 only 好了!不要试图使用它来跨线程通信。

事件对象管理一个内部标志,该标志可以用 set() 方法并用重置为false clear() 方法。这个 wait() 方法将阻塞,直到该标志为true;一旦该标志设置为true,则当前在调用 wait() 将被安排唤醒。

请注意,在任何单独的greenlet运行之前,该标志可能会被清除并设置多次;greenlet可以确定的是该标志已经设置 至少一次 在它等待的时候。如果greenlet关心标志是否仍然设置,它必须检查 ready() 可能还会打电话回来 wait() 再一次。

备注

等待中的小菜被唤醒的确切顺序和时间尚未确定。

一旦事件设置好,其他小菜可以在任何等待的小菜被唤醒之前运行。

虽然这里的代码将按照等待的顺序唤醒greenlet,但是每一个这样运行的greenlet都可能反过来导致其他greenlet运行。

这些细节将来可能会改变。

在 1.5a3 版本发生变更: 等待中的小菜现在按照等待的顺序被唤醒。

在 1.5a3 版本发生变更: 低层 rawlink 方法(大多数用户不会使用此方法)现在在调用等待者之前自动取消其链接。

在 20.5.1 版本发生变更: 的呼叫者 wait 找到已经设置好的事件将在其他必须阻止的服务员之后运行。看到了吗 issue #1520 .

is_set()[源代码]#
isSet()[源代码]#
ready()[源代码]#

只有当内部标志为真时才返回真。

clear()[源代码]#

将内部标志重置为false。

随后,线程调用 wait() 将阻止到 set() 调用以再次将内部标志设置为true。

is_set()[源代码]#

只有当内部标志为真时才返回真。

set()[源代码]#

将内部标志设置为“真”。

在未来的某个时候,所有等待它成真的小菜都会以某种顺序被唤醒。格林莱特的电话 wait() 一旦标志为真,就不会阻塞(直到 clear() 被称为。

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

阻止,直到此对象 ready() .

如果输入时内部标志为真,则立即返回。否则,阻塞直到另一线程(greenlet)调用 set() 将标志设置为true,或直到 超时 到期。

timeout 参数存在而不是 None ,它应该是一个浮点数,以秒(或其分数)为单位指定操作超时。

返回:

如果且仅当内部标志已设置为true时(无论是在wait调用之前还是在wait启动之后),则此方法返回true,因此它将始终返回 True 除非超时并且操作超时。

在 1.1 版本发生变更: 返回值表示经过等待期间的标志,而不仅仅是经过等待之后的标志。这解决了一个greenlet设置时的竞争条件,然后在其他greenlet等待时清除标志而不切换。当等待者醒来时,这将返回true;以前,他们仍然会醒来,但返回值将为false。当 超时 是存在的。

class AsyncResult[源代码]#

基类:AbstractLinkable

存储值或异常的一次性事件。

喜欢 Event 当它唤醒所有的侍者 set()set_exception() 被调用。waiters可以通过调用 get() 而不是 wait() . 安 AsyncResult 无法重置实例。

重要

此对象用于在同一线程内的greenlet之间进行通信 only 好了!不要试图使用它来跨线程通信。

要传递值调用,请执行以下操作 set() 。呼叫至 get() (当前阻止的和将来创建的)将返回值::

>>> from gevent.event import AsyncResult
>>> result = AsyncResult()
>>> result.set(100)
>>> result.get()
100

传递异常调用 set_exception() 。这将导致 get() 要引发该例外,请执行以下操作:

>>> result = AsyncResult()
>>> result.set_exception(RuntimeError('failure'))
>>> result.get()
Traceback (most recent call last):
 ...
RuntimeError: failure

AsyncResult 机具 __call__() 因此可以用作 link() 目标::

>>> import gevent
>>> result = AsyncResult()
>>> gevent.spawn(lambda : 1/0).link(result)
>>> try:
...     result.get()
... except ZeroDivisionError:
...     print('ZeroDivisionError')
ZeroDivisionError

备注

等待小菜被唤醒的顺序和时间尚未确定。作为一个实现说明,在gevent 1.1和1.0中,等待的greenlet有时会以一种不确定的顺序被唤醒。 之后 当前的greenlet生成事件循环。其他小菜(那些不等待被唤醒的小菜)可能在当前的小菜产量和等待被唤醒的小菜之间运行。这些细节将来可能会改变。

在 1.1 版本发生变更: 等待的小菜被唤醒的确切顺序与1.0中的顺序不同。

在 1.1 版本发生变更: 回调 linked 对于此对象,必须是可哈希的,并合并重复项。

在 1.5a3 版本发生变更: 等待中的小菜现在按照等待的顺序被唤醒。

在 1.5a3 版本发生变更: 低层 rawlink 方法(大多数用户不会使用此方法)现在在调用等待者之前自动取消其链接。

cancel()[源代码]#
cancelled()[源代码]#
done()[源代码]#
get(block=True, timeout=None)[源代码]#

返回存储值或引发异常。

如果此实例已包含值或异常,请立即返回或引发它。否则,阻止直到另一个greenlet调用 set()set_exception() 或者直到出现可选超时。

超时 论点存在而不是 None ,它应该是一个浮点数,以秒(或其分数)为单位指定操作超时。如果 超时 逝去,那 超时 将引发异常。

参数:

block (bool) -- 如果设置为 False 而这个实例还没有准备好,立即引发 Timeout 例外。

get_nowait()[源代码]#

返回值或在不阻塞的情况下引发异常。

如果这个对象还没有 ready ,升高 gevent.Timeout 立即。

ready()[源代码]#

仅当且仅当它包含值或异常时返回true

result(timeout=None)[源代码]#
set(value=None)[源代码]#

储存价值,唤醒所有服务员。

所有绿色小菜都被挡住了 get()wait() 被唤醒。后续呼叫 wait()get() 完全不会阻塞。

set_exception(exception, exc_info=None)[源代码]#

存储异常并唤醒所有服务员。

所有绿色小菜都被挡住了 get()wait() 被唤醒。后续呼叫 wait()get() 完全不会阻塞。

参数:

exc_info (tuple) -- 如果给定,则是一个标准的三元组类型、值, traceback 由返回 sys.exc_info() . 这将在重新引发异常以传播正确的回溯时使用。

set_result(value=None)#

储存价值,唤醒所有服务员。

所有绿色小菜都被挡住了 get()wait() 被唤醒。后续呼叫 wait()get() 完全不会阻塞。

successful()[源代码]#

如果且仅当它已准备好并保持值时返回true

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

阻止,直到实例就绪。

如果此实例已包含值,则立即返回该值。如果此实例已包含异常, None 立即归还。

否则,阻止直到另一个greenlet调用 set()set_exception() (此时值或 None 将分别返回),或直到可选超时到期(此时 None 也将被退回)。

timeout 参数存在而不是 None ,它应该是一个浮点数,以秒(或其分数)为单位指定操作超时。

备注

如果超时并过期, None 将返回(不会引发超时异常)。

property exc_info#

异常信息的三元组if set_exception() 被叫来。

property exception#

保留传递给的异常实例 set_exception() 如果 set_exception() 被呼叫。否则 None .

property value#

保留传递给的值 set() 如果 set() 被呼叫。否则, None