gevent.Timeout
¶合作超时可以通过 gevent.Timeout
类和助手函数 gevent.with_timeout()
.
提高 例外 在当前绿叶中 秒 已经过去:
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
)定义不清楚。在未来,支持负值可能与支持 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
语句会自动执行此操作。
创建已开始 Timeout
.
这是一条捷径,具体行动取决于 超时 的类型:
返回 Timeout
实例。
如果计划引发超时,则为true。
Next page: gevent.socket
--低层协同组网接口