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

如何在python中真正实现超时?,python,eventlet,Python,Eventlet,如何在python中真正实现超时 代码如下所示: #!/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 Tru

如何在python中真正实现超时

代码如下所示:

#!/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.I替换为:

 time.sleep(0.1)
与:

为异常添加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)
它就像一个符咒


解决了

事件我们的超时并不像你希望的那么神奇。它只能在“绿色线程化”代码中检测超时——该代码使用eventlet的协作多线程系统。如中所述,“不能对此类执行仅CPU的操作超时”<代码>时间.睡眠使用Python的内部线程系统暂停,而不是eventlet的绿色线程


相反,请使用绿色线程可以正常工作的线程。

@stackterminator将“time.sleep”替换为“eventlet.sleep”。我将对标准输出进行质疑。是否有eventlet try/except?(:如果您阅读超时文档,您将看到它的行为与预期完全一致:如果超时在块完成之前过期,则超时将作为异常引发。您将在文档中找到如何捕获超时的示例。正如预期的那样,您的最终块将在异常结束程序之前运行。因为您没有为eventlet提供有机会跑步。你可能会发现这个答案很有用:
eventlet.sleep(0)