协作超时使用 gevent.Timeout#

合作超时可以通过 gevent.Timeout 类和助手函数 gevent.with_timeout() .

class Timeout(seconds=None, exception=None, ref=True, priority=-1)[源代码]#

基类:BaseException

提高 例外 在当前绿叶中 已经过去:

timeout = Timeout(seconds, exception)
timeout.start()
try:
    ...  # exception will be raised here, after *seconds* passed since start() call
finally:
    timeout.close()

警告

你必须 始终 打电话 close 在一个 Timeout 对象,无论受超时保护的代码是否在超时结束前完成执行(无论 Timeout 引发异常)此 try/finally 构造或一个 with 语句是一个很好的模式。(如果要重新启动超时对象,请使用 cancel 而不是 close ;这是罕见的。你一定还会 close (当您完成时,请单击它。)

什么时候? 例外 被省略或 None , the Timeout 实例本身被引发::

>>> import gevent
>>> gevent.Timeout(0.1).start()
>>> gevent.sleep(0.2)  
Traceback (most recent call last):
 ...
Timeout: 0.1 seconds

如果 参数未给定或是 None (例如, Timeout() ,那么超时将永远不会过期,也不会增加。 例外 . 这便于创建采用自己的可选超时参数的函数。(注意这是 not 和A一样 价值 0

def function(args, timeout=None):
   "A function with an optional timeout."
   timer = Timeout(timeout)
   with timer:
      ...

小心

A 值小于 0.0 (例如, -1 )定义不清楚。在未来,支持负值可能与支持 None0

A 价值 0 请求事件循环旋转并轮询I/O;一旦控件返回事件循环,它将立即过期。

用作上下文管理器

要简化启动和取消超时,请 with 语句可用于:

with gevent.Timeout(seconds, exception) as timeout:
    pass  # ... code block ...

这相当于上面的Try/Finally块,还有一个附加功能:如果 例外 是文字 False ,仍然会引发超时,但上下文管理器将其抑制,因此WITH块外部的代码将看不到它。

这对于向不支持 超时 参数本身:

data = None
with gevent.Timeout(5, False):
    data = mysock.makefile().readline()
if data is None:
    ...  # 5 seconds passed without reading a line
else:
    ...  # a line was read within 5 seconds

小心

如果 readline() 在上面抓不起来 BaseException (例如, except: ,那么您的超时将无法工作,并且在您期望的时候,控制将不会返回给您。

捕捉超时

在捕获超时时,请记住,捕获的可能不是您设置的超时(调用函数可能设置了自己的超时);如果要使超时静音,请始终检查它是否是您需要的实例:

timeout = Timeout(1)
timeout.start()
try:
    ...
except Timeout as t:
    if t is not timeout:
        raise # not my timeout
finally:
    timeout.close()

在 1.1b2 版本发生变更: 如果 没有给出或是 None ,不再分配永远不会启动的本机计时器对象。

在 1.1 版本发生变更: 添加有关否定的警告 价值观。

在 1.3a1 版本发生变更: 超时对象现在有一个 close() 方法,该方法 must 当超时将不再用于正确清理本机资源时调用。这个 with 语句会自动执行此操作。

__enter__()[源代码]#

启动并返回计时器。如果计时器已经启动,则返回计时器。

__exit__(typ, value, tb)[源代码]#

停止计时器。

在 1.3a1 版本发生变更: 底层本机计时器也将停止。此对象不能再次使用。

cancel()[源代码]#

如果超时处于挂起状态,请取消它。否则,什么也不做。

超时对象可以是 started 再一次。如果不再次启动超时,则应使用 close() 相反。

close()[源代码]#

关闭超时并释放资源。使用此方法后,无法再次启动计时器。

start()[源代码]#

安排超时。

classmethod start_new(timeout=None, exception=None, ref=True, _one_shot=False)[源代码]#

创建已开始 Timeout .

这是一条捷径,具体行动取决于 超时 的类型:

  • 如果 超时 是一个 Timeout ,然后称之为 start() 方法(如果尚未开始)。

  • 否则,创建新的 Timeout 实例,传递( 超时例外 )作为参数,然后调用 start() 方法。

返回 Timeout 实例。

property pending#

如果计划引发超时,则为true。