2012-10-21 75 views
1

以下是我的瓶子代碼。我正在使用帶有gevent循環的uWSGI。從請求開始,如果整個請求的時間超過90毫秒,我需要返回false。 我沒有得到如何使用gevent在90ms後超時。阻塞碼少於2毫秒。它的redis調用是這個問題。在沒有負載或負載很小的情況下...整個請求需要20ms以下。在嚴重負載下,Redis呼叫可能需要更長的時間......如果時間更長,我需要超時。因此,從第一次redis調用中,如果超過90毫秒的返回超時。如果小於90ms,則計算餘數。例如。如果呼叫一個需要60毫秒,那麼我有兩個30毫秒的呼叫。如果呼叫2需要更長的時間然後超過30毫秒。uWSGI,gevent,一些redis調用以及如何超過90毫秒超時後

@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" 

回答

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() 
+0

我試過,但沒有奏效。它沒有超時。 jt = gevent.spawn(cookie_redis_call,guid) jt.join(.0009) jt.kill() – Tampa

+0

確保你的猴子補丁redis-py變得合作 –

+0

太棒了!它的工作,但如何知道是否有超時?現在我沒有。但我需要知道,如果有一個由於超時沒有,而不是沒有做到沒有鑰匙.... – Tampa

相關問題