python - 在python多生产者和多消费者线程中,queue.join()可能不可靠吗?

标签 python multithreading queue

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

最佳答案

通常的方法是在生产者完成时将一个哨兵值(例如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() 将阻塞,直到消费者从队列中删除某些内容。

关于python - 在python多生产者和多消费者线程中,queue.join()可能不可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39004095/

相关文章:

php - 所有 cookie 都是平等的吗?

python - 为什么 bash 看不到我的文件?

Python:Lambda 表达式

c++ - 使用两个线程和 boolean 值的奇怪问题

java - 每个线程是否可以有一个唯一的静态变量?

python - 将元组传递给 python 类方法

java - 使用另一个线程获取在一个线程中创建的数据

javascript - 在 Bull 队列和数据库触发器之间进行选择

c - 当套接字在队列之后打开时,共享套接字描述符在消息队列上无效

javascript - 如何在公牛队列中收听已完成的事件 - 仅适用于当前工作