1

以下は、ボトル内の私のコードです。gevent ループで uWSGI を使用しています。リクエストの時点から、リクエスト全体に 90 ミリ秒以上かかっている場合は false を返す必要があります。gevent を使用して 90ms 後にタイムアウトする方法がわかりません。ブロッキング コードは 2 ミリ秒未満です。問題はredis呼び出しです。負荷がかかっていない場合でも、ほとんど負荷がかかっていない場合でも、リクエスト全体にかかる時間は 20 ミリ秒未満です。重度の負荷がかかると、redis の呼び出しに時間がかかることがあります...それ以上かかる場合は、タイムアウトする必要があります。そのため、最初の redis 呼び出しから、リターンに 90 ミリ秒以上かかる場合はタイムアウトになります。90ms 未満の場合は、残りを計算します。たとえば、呼び出し 1 に 60 ミリ秒かかる場合、呼び出し 2 には 30 ミリ秒かかります。コール 2 に 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"
4

1 に答える 1

2
# 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()
于 2012-10-21T19:06:07.523 に答える