蟒蛇多生产者&多消费者线程伪代码:
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()
这样不可靠,我该如何检查所有工作是否完成?
答案 0 :(得分:2)
通常的方法是在生产者完成时在队列中放置一个sentinel值(如None
),每个消费者线程一个。然后编写消费者以便在从队列中提取None
时退出该线程。
所以,例如,在主程序中:
for t in list_of_producers:
t.join()
# Now we know all producers are done.
for t in list_of_consumers:
queue_of_data.put(None) # tell a consumer we're done
for t in list_of_consumers:
t.join()
和消费者看起来像:
def threadConsumer():
while True:
data = queue_of_data.get()
if data is None:
break
do_other_work()
注意:如果生产者可以压倒消费者,请创建具有最大大小的队列。然后queue.put()
将在队列达到该大小时阻塞,直到消费者从队列中删除某些内容。