2011-07-12 17 views
5

以下腳本的目的是同時執行多個函數,但我不知道爲什麼它不能正常工作。
這些功能以順序方式執行,而不是並行執行。使用greenlet同時執行多個函數的問題

我會很感激任何建議澄清我,關於我做錯了什麼。

import time 
import eventlet 


EXECUTION_TIMEOUT = 10 

def example(name, steps_limit): 
    print 'Starting process %s with %d steps' % (name, steps_limit) 
    for i in range(1, steps_limit+1): 
     print "Process %s, step %d" % (name, i) 
     time.sleep(2) 
    print 'Finishing process %s with %d steps' % (name, steps_limit) 


def fetch(input_data): 
    example(input_data['name'], input_data['steps']) 

test_data = [{'name':'proceso1', 'steps':3}, 
      {'name':'proceso2', 'steps':5}, 
      {'name':'proceso3', 'steps':6}, 
      ] 

def main(): 
    #Setting up time out 
    timeout = eventlet.timeout.Timeout(EXECUTION_TIMEOUT) 
    #initialize pool 
    pool = eventlet.GreenPool(size=1000) 
    try: 
     for hits in pool.imap(fetch, test_data): 
      pass 
    except eventlet.Timeout: 
     print 'Operation interrupted by timeout concept' 
    finally: 
     timeout.cancel() 


if __name__ == '__main__': 
    main() 
+0

請包括您收到的任何錯誤消息,並更具體地瞭解正在發生的事情。它是否立即返回?它永遠掛起?你有什麼試圖解決它? – TorelTwiddler

+0

沒有錯誤消息,它不會永遠掛起。問題在於這個過程是以一種明確的方式發生的,而不是無序的。每個功能在上一次完成時啓動。我不希望那樣。 – rmaceissoft

+1

我已經看到了什麼是我的錯誤。我使用「time.sleep」而不是「eventlet.sleep」。不同的是,最後一個不會阻塞整個解釋器,因此讓其他greenlet也可以繼續處理它們的請求。感謝我自己這一次; - )....我希望這個虛擬問題可以幫助其他人...... – rmaceissoft

回答

2

你是對的time.sleep()是罪魁禍首。

但是,您不必將time.sleep()替換爲eventlet.sleep()。相反,你可以將猴子補丁time.sleep變成eventlet.sleep

這實際上是首選,因爲這樣你不知道使用time.sleep的庫也會得到修復,而如果你自己修復它,你只能修復你的代碼。

因此,在gevent,我們只是建議撥打gevent.monkey.patch_all()所有程序。在eventlet中,存在類似的功能。

+0

感謝您的寶貴意見。使用evenlet時,您可以使用相同的效果。 eventlet.monkey_patch() 甚至,你可以指定你想要猴子補丁的模塊。例如,對於只有猴子補丁時間模塊, eventlet.monkey_patch(time = True) – rmaceissoft