是否有选项可以检查队列是否为空且所有线程都已完成处理任务(即运行了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)
执行最后一个任务时,队列为空。
答案 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!")