Python - 检查队列中的所有任务是否完成
是否有一个选项来检查队列是否为空,并且所有线程已经完成处理其任务(即运行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)
队列只要最后的任务的执行开始是空的。
回答:
这里没有公共接口。有人可能会发布一个脆弱的解决方案,戳穿队列用于追踪未完成任务的内部属性,但严重的是,不要这样做。该属性不是已记录的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!")
以上是 Python - 检查队列中的所有任务是否完成 的全部内容, 来源链接: utcz.com/qa/259534.html