下面是我在 Bottle 中的代码。我正在使用带有 gevent 循环的 uWSGI。从请求的时间开始,如果整个请求花费的时间超过 90 毫秒,我需要返回 false。我不明白如何使用 gevent 在 90 毫秒后超时。阻塞代码少于 2 毫秒。问题在于 redis 调用。在没有负载或负载很少的情况下…整个请求花费的时间不到 20 毫秒。在重负载下,redis 调用可能需要更长时间…如果时间更长,我需要超时。因此,从第一个 redis 调用开始,如果花费的时间超过 90 毫秒,则超时返回。如果少于 90 毫秒,计算余数。例如,如果第一次调用花费 60 毫秒,那么第二次调用有 30 毫秒。如果第二次调用花费的时间超过 30 毫秒,则超时。
@post('/test')
def test():
#START THE TIMER
#SOME BLOCKING CODE
#MAKE A REDIS CALL AND SERVICE OTHER REQUESTS
jt = [gevent.spawn(redis_call)]
gevent.joinall(jt)
#SOME BLOCKING CODE
#MAKE A REDIS CALL AND SERVICE OTHER REQUESTS
jt = [gevent.spawn(redis_call)]
gevent.joinall(jt)
if total_time<.09:
yield "passed"
else:
yield "failed"
# start redis_call in a background greenlet
g = gevent.spawn(redis_call)
# wait for up to 90 seconds for redis_call to complete
g.join(90)
# if g has finished, kill() is a no-op
# if g is still running, kill() will interrupt it (by raising GreenletExit in it)
# by default, kill() waits for greenlet to exit (which might never happen,
# if redis_call caught GreenletExit and ignored it). You can also do g.kill(block=False) to
# avoid waiting for killing to complete
g.kill()