如何在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)
它就像一个魅力.
解决了
eventlet的超时并不像你希望的那样神奇.它只能检测"绿色"代码中的超时 - 使用eventlet的协同多线程系统的代码.正如Timeout文档中所述,"你不能超时使用这个类的CPU操作". time.sleep暂停Python的内部线程系统,而不是eventlet的greenthreads.
相反,使用eventlet.sleep可以正确使用greenthreads.