如何真正实现python中的超时?

sta*_*tor 4 python eventlet

如何在python中真正实现超时?http://eventlet.net/doc/modules/timeout.html

代码如下:

#!/usr/bin/python
import eventlet
import time
import sys
import random

while True:
        try:
         with eventlet.timeout.Timeout(1, False):
                print 'limited by timeout execution'
                while True:
                        print '\r' + str(random.random()),
                        sys.stdout.flush()
                        eventlet.sleep(0)
                print ' Never printed Secret! '
        except Exception as e:
                print ' Exception: ', e
        finally:
                print ''
                print ' Timeout reached '
                print ''
Run Code Online (Sandbox Code Playgroud)

永远不会超时.我哪里错了?

我替换了Ps:

 time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)

有:

 eventlet.sleep(0)
Run Code Online (Sandbox Code Playgroud)

为异常添加False,现在效果很好:

with eventlet.timeout.Timeout(1):
Run Code Online (Sandbox Code Playgroud)

改成:

with eventlet.timeout.Timeout(1, False):
Run Code Online (Sandbox Code Playgroud)

但它只适用于eventlet.sleep(0.1)

例如,此代码错误:

#!/usr/bin/python
import eventlet
import time
start_time = time.time()
data = 0
with eventlet.timeout.Timeout(1, False):
        while True:
                data +=1
print 'Catch data ', data, ' in ', time.time() - start_time
Run Code Online (Sandbox Code Playgroud)

我只是添加睡眠0秒:

eventlet.sleep(0)
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.

解决了

kev*_*ner 5

eventlet的超时并不像你希望的那样神奇.它只能检测"绿色"代码中的超时 - 使用eventlet的协同多线程系统的代码.正如Timeout文档所述,"你不能超时使用这个类的CPU操作". time.sleep暂停Python的内部线程系统,而不是eventlet的greenthreads.

相反,使用eventlet.sleep可以正确使用greenthreads.

  • 如果您阅读Timeout文档,您将看到它的行为完全符合预期:如果超时在块完成之前到期,则Timeout将自身提升为异常.您将找到如何在文档中捕获超时的示例.正如预期的那样,您的finally块在异常结束程序之前运行. (2认同)