1

我有一个服务器在一个部分中执行“一些事情”,并且我有一个“with gevent.Timeout(5)”围绕它。我在另一个greenlet中进行了一些检查,通过它我注意到其中一个执行“某些事情”的greenlet运行了45分钟。我最终不得不重新启动程序才能杀死它(我知道其他杀死它的方法,但这不是问题..)。

我也使用 gevent.monkey.patch_all() 进行修补。“一些东西”部分确实涉及网络连接,我猜有些东西卡在其中一个地方。我不明白为什么没有引发超时异常。有谁知道为什么可能没有引发 gevent.Timeout 异常?

4

1 回答 1

0

每当我gevent.Timeout使用它时,我也将它用作上下文管理器,但带有第二个参数False。这样,上下文管理器会抑制任何异常并只留下代码块。您可以通过检查块是否成功设置值来跟进:

result = None
with gevent.Timeout(5, False):
    # Something that stalls

if result == None:
    # Take care of business

这对我来说非常可靠。似乎默认的第二个参数exception是- 您是否尝试将其替换为您自己的异常类型gevent.TimeoutNone甚至Exception

于 2013-03-28T20:34:01.120 回答