gevent.event
--多个侦听器的通知#
- class Event[源代码]#
基类:
AbstractLinkable
允许一个greenlet唤醒另一个或多个greenlet的同步原语。它的接口与
threading.Event
但在绿叶树上却起作用。重要
此对象用于在同一线程内的greenlet之间进行通信 only 好了!不要试图使用它来跨线程通信。
事件对象管理一个内部标志,该标志可以用
set()
方法并用重置为falseclear()
方法。这个wait()
方法将阻塞,直到该标志为true;一旦该标志设置为true,则当前在调用wait()
将被安排唤醒。请注意,在任何单独的greenlet运行之前,该标志可能会被清除并设置多次;greenlet可以确定的是该标志已经设置 至少一次 在它等待的时候。如果greenlet关心标志是否仍然设置,它必须检查
ready()
可能还会打电话回来wait()
再一次。备注
等待中的小菜被唤醒的确切顺序和时间尚未确定。
一旦事件设置好,其他小菜可以在任何等待的小菜被唤醒之前运行。
虽然这里的代码将按照等待的顺序唤醒greenlet,但是每一个这样运行的greenlet都可能反过来导致其他greenlet运行。
这些细节将来可能会改变。
在 1.5a3 版本发生变更: 等待中的小菜现在按照等待的顺序被唤醒。
在 1.5a3 版本发生变更: 低层
rawlink
方法(大多数用户不会使用此方法)现在在调用等待者之前自动取消其链接。在 20.5.1 版本发生变更: 的呼叫者
wait
找到已经设置好的事件将在其他必须阻止的服务员之后运行。看到了吗 issue #1520 .- 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
方法(大多数用户不会使用此方法)现在在调用等待者之前自动取消其链接。- get(block=True, timeout=None)[源代码]#
返回存储值或引发异常。
如果此实例已包含值或异常,请立即返回或引发它。否则,阻止直到另一个greenlet调用
set()
或set_exception()
或者直到出现可选超时。当 超时 论点存在而不是
None
,它应该是一个浮点数,以秒(或其分数)为单位指定操作超时。如果 超时 逝去,那 超时 将引发异常。- 参数:
block (bool) -- 如果设置为
False
而这个实例还没有准备好,立即引发Timeout
例外。
- get_nowait()[源代码]#
返回值或在不阻塞的情况下引发异常。
如果这个对象还没有
ready
,升高gevent.Timeout
立即。
- set_exception(exception, exc_info=None)[源代码]#
存储异常并唤醒所有服务员。
所有绿色小菜都被挡住了
get()
或wait()
被唤醒。后续呼叫wait()
和get()
完全不会阻塞。- 参数:
exc_info (tuple) -- 如果给定,则是一个标准的三元组类型、值,
traceback
由返回sys.exc_info()
. 这将在重新引发异常以传播正确的回溯时使用。
- 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
.