Python - 检查队列中的所有任务是否都已完成

时间:2017-12-03 04:56:09

标签: python multithreading queue

是否有选项可以检查队列是否为空且所有线程都已完成处理任务(即运行了task_done())?我想仅在满足两个条件时才添加其他任务。

由于我希望能够添加更多任务,我不能只是退出未使用的线程并使用activeCount()。此外,我不想加入()队列,因为我希望能够主动监视执行的进度。

以下是一个示例代码:

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)

执行最后一个任务时,队列为空。

1 个答案:

答案 0 :(得分:2)

这没有公共接口。有人可能会发布一个脆弱的解决方案,盯着队列用来跟踪未完成任务的内部属性,但严重的是,不要这样做。该属性不是文档化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!")