2013-07-08 74 views
4

如何在Python中真正實現超時? http://eventlet.net/doc/modules/timeout.html如何在python中實現超時?

代碼如下所示:

#!/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 '' 

超時永遠不會達到。我錯在哪裏?

P.s.我換成:

time.sleep(0.1) 

有:

eventlet.sleep(0) 

添加假的例外,現在它工作得很好:

with eventlet.timeout.Timeout(1): 

變化:

with eventlet.timeout.Timeout(1, False): 

但它只能與eventlet.sleep(0.1)

E.g此代碼錯誤:

#!/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 

我只需添加休眠0秒:

eventlet.sleep(0) 

它就像一個魅力。

解決

回答

5

eventlet的超時並不像你希望的那樣神奇。它只能檢測「greenthreaded」代碼中的超時 - 使用eventlet的協作式多線程系統的代碼。正如在the Timeout docs中指出的那樣,「你不能用這個類超時CPU操作」。 time.sleep暫停與Python的內部線程系統,而不是eventlet的greenthreads。

而是使用eventlet.sleep,它可以與greenthreads正常工作。

+0

你能粘貼我真正的代碼? – 2013-07-08 20:58:56

+0

@stackterminator將「time.sleep」替換爲「eventlet.sleep」。 – kevingessner

+0

我這樣做,但它仍然不起作用 – 2013-07-08 21:02:16