为什么gevent.Timeout()不能引发Exception

时间:2015-08-20 06:44:04

标签: timeout gevent

使用gevent.Timeout(0.1)作为tt:

time.sleep(1)

以上,不会引发异常

使用gevent.Timeout(0.1)作为tt:

gevent.sleep(1)

throw gevent.timeout.Timeout:0.1秒

区别在于time.sleep()和gevent.sleep()!

1 个答案:

答案 0 :(得分:1)

time.sleep()实际上暂停了所有代码的执行,并且不允许任何其他代码运行。 Gevent是一个事件循环,这意味着它允许其他"线程" (greenlets)在阻止时运行。

基本上gevent有一个正在执行的任务列表。它只允许一次运行1个任务。如果你说time.sleep(1),那个任务仍在运行,但没有做任何事情。如果你说gevent.sleep(1),它会暂停当前任务并允许其他任务运行。

gevent.Timeout()实际上启动了第二个任务来监控已经过去的时间。由于time.sleep()永远不会产生,第二个任务永远不会有机会抛出错误。