如何在python中真正实现超时?
如何在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
#!/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)