在python multi-producer&多用户线程,可能queue.join()不可靠?

时间:2016-08-17 18:43:02

标签: python multithreading queue

蟒蛇多生产者&多消费者线程伪代码:

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()这样不可靠,我该如何检查所有工作是否完成?

1 个答案:

答案 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()将在队列达到该大小时阻塞,直到消费者从队列中删除某些内容。