【发布时间】:2017-05-04 14:08:24
【问题描述】:
我有两个绿叶。第一个 greenlet 在触发 HTTP 请求之前启动 7 秒超时,我知道该请求需要 5 秒才能完成。第二个 greenlet 正在执行一些 CPU 密集型任务(由 time.sleep 模拟),需要 10 秒才能完成。代码:
from gevent import monkey; monkey.patch_socket()
import time
import gevent
import requests
def f1():
try:
with gevent.Timeout(7):
print "f1: downloading our page in 5 seconds"
requests.get('http://httpbin.org/delay/5')
except gevent.Timeout:
print "Timed out."
else:
print "Finished!"
def f2():
print "f2: being greedy for 10 seconds"
time.sleep(10)
if __name__ == '__main__':
g1 = gevent.spawn(f1)
g2 = gevent.spawn(f2)
gevent.joinall([g1, g2])
当我运行此代码时,即使我知道 HTTP 请求已完成,也会触发超时:
$ python test.py
f1: downloading our page in 5 seconds
f2: being greedy for 10 seconds
Timed out.
time.sleep 调用显然是造成超时的原因,但我实际上并不关心这需要多长时间。我真正想要限制的是 HTTP 请求的持续时间。
有没有办法编写此代码,以便仅在 HTTP 请求未完成时才发生超时?有没有办法在超时事件之前先处理 I/O 事件?
【问题讨论】: