【发布时间】:2023-03-11 19:40:01
【问题描述】:
一个python多生产者和多消费者线程伪代码:
def threadProducer():
while upstreams_not_done:
data = do_some_work()
queue_of_data.put(data)
def threadConsumer():
while True:
data = queue_of_data.get()
do_other_work()
queue_of_data.task_done()
queue_of_data = queue.Queue()
list_of_producers = create_and_start_producers()
list_of_consumers = create_and_start_consumers()
queue_of_data.join()
# is now all work done?
其中queue_of_data.task_done() 为队列中的每个项目调用。
当生产者工作比消费者慢时,是否有可能queue_of_data.join() 在某个时刻没有生产者生成数据,但所有消费者都完成了他们的任务由task_done()?
如果Queue.join() 这样不可靠,我如何检查所有工作是否完成?
【问题讨论】:
-
thread.join 和 Queue.join 测试不同的条件,应该用于不同的目的。 thread.join 只有在线程清空队列后退出时才有用。
-
Queue.join()对其预期用途是可靠的:当所有工作项在消费者开始工作之前排队时。然后(并且只有那时)可以确定“所有标记为完成的队列项目”意味着“所有工作都已完成”。 -
感谢@TimPeters,但如果生产者的太多项目可能大于 RAM,则不可能在消费者开始之前排队 ,如何处理多生产者和多消费者线程?
-
@vbem,查看我的答案及其最近的编辑
标签: python multithreading queue