2017-12-03 152 views
0

是否有一個選項來檢查隊列是否爲空,並且所有線程已經完成處理其任務(即運行task_done())?我只想在滿足這兩個條件的情況下添加其他任務。Python - 檢查隊列中的所有任務是否完成

因爲我希望能夠添加更多的任務,我不能只是退出未使用的線程,並使用activeCount()。另外我不想加入()Queue,因爲我希望能夠主動監視執行的進度。

下面是一個例子代碼:

from Queue import Queue 
from threading import Thread 
import time 

queue = Queue() 

def my_method(queue): 
    while True: 
     task = queue.get() 

     time.sleep((task + 2) * 3) 

     queue.task_done() 

num_queue_threads = 2 
queue_threads = [None] * num_queue_threads 

for i in range(num_queue_threads): 
    queue_threads[i] = Thread(target=my_method, args=(queue,)) 
    queue_threads[i].setDaemon(True) 
    queue_threads[i].start() 

for task in range(3): 
    queue.put(task) 

#queue.join() #need to wait actively 

while True: 
    print("queue.qsize(): {}, queue.empty(): {}".format(queue.qsize(), queue.empty())) 

    time.sleep(1) 

隊列只要最後的任務的執行開始是空的。

回答

0

這裏沒有公共接口。有人可能會發佈一個脆弱的解決方案,戳穿隊列用於追蹤未完成任務的內部屬性,但嚴重的是,不要這樣做。該屬性不是已記錄的API的一部分,可以在未來的版本中重新命名或重新設計。

只需跟蹤任務完成自己。一種選擇是將有一個單獨的隊列,其中工人可以發送「任務完成」的消息給協調器,並協調器等待,直到它收到等於給它分配的任務數的數量的消息:

from Queue import Queue 
from threading import Thread 
import time 

task_queue = Queue() 
completion_queue = Queue() 

def my_method(in_queue, out_queue): 
    while True: 
     task = in_queue.get() 
     time.sleep((task + 2) * 3) 
     in_queue.task_done() 

     # Send completion message 
     out_queue.put(task) 

num_queue_threads = 2 
queue_threads = [None] * num_queue_threads 

for i in range(num_queue_threads): 
    queue_threads[i] = Thread(target=my_method, args=(task_queue, completion_queue)) 
    queue_threads[i].setDaemon(True) 
    queue_threads[i].start() 

for task in range(3): 
    task_queue.put(task) 

for _ in range(3): 
    completion_queue.get() 
    completion_queue.task_done() 
    print("One task done!") 

print("All done!") 
+0

的這裏唯一的問題是我無法控制completion_queue.get()需要多長時間,所以我可能無法執行任何週期性活動。但至少我知道沒有其他推薦的方式來跟蹤未完成的任務。我可能會改變我的邏輯來使用來自sqlite的任務狀態(因爲我已經使用這個數據庫來存儲他們的元數據)。謝謝! –

+0

另外 - 我可以用超時運行completion_queue.get(),忽略Empty異常,執行所需的週期性活動並返回到等待下一個任務。 –

相關問題