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

回到顶部