协作超时使用 gevent.Timeout
#
合作超时可以通过 gevent.Timeout
类和助手函数 gevent.with_timeout()
.
- class Timeout(seconds=None, exception=None, ref=True, priority=-1)[源代码]#
-
提高 例外 在当前绿叶中 秒 已经过去:
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
, theTimeout
实例本身被引发::>>> 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
)定义不清楚。在未来,支持负值可能与支持None
或0
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
语句会自动执行此操作。- classmethod start_new(timeout=None, exception=None, ref=True, _one_shot=False)[源代码]#
创建已开始
Timeout
.这是一条捷径,具体行动取决于 超时 的类型:
返回
Timeout
实例。
- property pending#
如果计划引发超时,则为true。