2013-11-27 28 views
0

運行從隊列中的所有條目同時與gevent.spawn

check a list constantly and do something if list has items

我實現這個解決方案:

workq = gevent.queue.Queue() 
def workqueue(): 
while True: 
    item = workq.get() 
    if gevent.spawn(startWork,item).value != "Ok": 
     workq.put(item) 

這背後的想法是,所有的隊列項目當它們發生時被派生到一個工人綠色小組,以便同時在隊列中的所有項目上運行開始工作(需要1-10分鐘)。問題是立即檢查返回值並且始終沒有。當我在值檢查之前加入連接時,我可以防止這種情況發生,但是我只能同時從隊列中處理一個項目,因爲我總是需要等待結果。 所以我的問題是有一種方法來產生greenlet,當他們單獨完成檢查結果,如果它不行,把他們放回隊列再次進行。

回答

1

所以我的問題是有一種方法來產生greenlet,因爲他們發生,當他們單獨完成檢查結果,如果它不行,把他們放回隊列再次進行。

你正在尋找的是一種加入整批員工的方式。您可以使用GroupPool工作人員進行此操作。

但是,您希望在發生的時候獲取值,而不是一次完成。爲此,你需要像未來一樣的東西。不同於線程和進程,據我所知,greenlet還沒有被賦予完整的將來/執行者抽象。 Greenlets本身有點像未來,但沒有什麼像wait(iterable_of_futures, FIRST_COMPLETED)來呼籲他們。

或者,您可以添加一個「輸出隊列」,使每個任務將其結果推送到輸出隊列中,然後將所有值從輸出隊列中拉出,直到完成。但是,你如何一次等待兩個隊列呢?明顯的做法是使用兩個greenlet。

或者,最簡單的話題,只是包裝的任務,以便它重新追加項目結尾:

def workqueue(): 
    def wrappedWork(item): 
     value = startWork(item) 
     if value != "Ok": 
      workq.put(item) 
    while True: 
     item = workq.get() 
     gevent.spawn(wrappedWork, item) 
+0

哇感謝這個簡單的解決方案。 A只是看看芹菜和其他複雜的任務系統。 – W0bble

相關問題