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

时间:2013-07-08 20:43:03

标签: 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 ''

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

P.S。我换了:

 time.sleep(0.1)

使用:

 eventlet.sleep(0)

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

with eventlet.timeout.Timeout(1):

更改为:

with eventlet.timeout.Timeout(1, False):

但它只适用于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

我只是添加睡眠0秒:

eventlet.sleep(0)

它就像一个魅力。

解决了

1 个答案:

答案 0 :(得分:5)

eventlet的超时并不像你希望的那样神奇。它只能检测“greenthreaded”代码中的超时 - 使用eventlet的协同多线程系统的代码。正如在the Timeout docs中所指出的那样,“你不能用这个类来超时仅CPU操作”。 time.sleep暂停Python的内部线程系统,而不是eventlet的greenthreads。

相反,请使用可与greenthreads正常工作的eventlet.sleep