Python 生产者多消费者问题,消费者在生产者完成工作之前完成工作

Python 生产者多消费者问题,消费者在生产者完成工作之前完成工作,python,multithreading,producer-consumer,Python,Multithreading,Producer Consumer,我有一个生产者和多个消费者。当我使用了太多的消费者时,Q很快就会变空,然后我所有的消费者都停止工作,而生产者仍在生产商品 我的代码 Producer.py class Producer(): def __init__(self,q): self.q = q print("Producer") def generateItem(self): for i in range(1,100): print("gene

我有一个生产者和多个消费者。当我使用了太多的消费者时,Q很快就会变空,然后我所有的消费者都停止工作,而生产者仍在生产商品

我的代码

Producer.py

class Producer():
    def __init__(self,q):
        self.q = q
        print("Producer")

    def generateItem(self):
        for i in range(1,100):
            print("generated item ",i,"\n")
            self.q.put(i)
Consumer.py:

class Consumer():

    def __init__(self,q):
        print("Consumer")
        self.q = q


    def consumeItem(self):
        while  True:
            if(not self.q.empty) : 
                print("consumed item : " ,self.q.get(),"\n")
            else :
                print("consumer is done")
主要服务:

import queue

import threading
q=queue.Queue(maxsize=0)

from Producer import Producer
from Consumer import Consumer

producer=Producer(q)
consumer=Consumer(q)

threads=[]
threads.append(threading.Thread(target=producer.generateItem,name="thread1"))
threads.append(threading.Thread(target=consumer.consumeItem,name="thread2"))
threads.append(threading.Thread(target=consumer.consumeItem,name="thread3"))
threads.append(threading.Thread(target=consumer.consumeItem,name="thread4"))

for thread in threads:
    thread.start()
日志:

generated item 1
generated item 2
generated item 3
consumed item :1
consumed item :2
consumed item :3
consumer is done
consumer is done
consumer is done
generated item 4
generated item 5
....
您可以应用线程对象作为通信机制

这是最简单的通信机制之一 线程:一个线程发出事件信号,其他线程等待它

示例工作模式(生成10项):

输出:

Producer
Consumer
thread1 generated item 1
thread2 consumed item : 1
thread1 generated item 2
thread3 consumed item : 2
thread1 generated item 3
thread4 consumed item : 3
thread1 generated item 4
thread4 consumed item : 4
thread1 generated item 5
thread2 consumed item : 5
thread1 generated item 6
thread2 consumed item : 6
thread1 generated item 7
thread4 consumed item : 7
thread1 generated item 8
thread4 consumed item : 8
thread1 generated item 9
thread2 consumed item : 9
*** producer thread1 finished work
*** consumer thread3 finished work
*** consumer thread2 finished work
*** consumer thread4 finished work

“当不再有生产者时消费者如何停止”:询问
self.q.empty()
。如果在空的
队列上调用
self.q.get()
,则应该会出现错误。这可能导致未定义的行为。除此之外,还可以使用参数
title
使用
def consumeritem(self,title):
,但不能作为
args=('mytitle',)
传递。阅读也我删除了标题(粘贴在这里,因为我做了测试)。关于check self.q,empty(),如果我添加check,仍然无法帮助我完成循环。您需要一个
else:break
else return
。该条件可能在
上,而不是单独的
if
。从程序上讲,在你的问题中编辑代码以改变你所问的行为通常是个坏主意。如果有书面答案,它可能会使答案无效。我们无法回答移动的目标!如果你得到了问题的答案,但基于这些答案的解决方案有新的问题,可以问一个单独的问题(可能有一个链接回到上一个问题的上下文)。我更新了这篇文章,这样它会更清晰。看起来不错!如果你有多个生产商,你会如何处理?我想同步另一个Q,该Q将包含每个制作人的项目,当该Q为空时,我将完成消费者。@JeyJ,这是另一个问题。我已经发布了一个针对当前情况的工作方案。我不会无休止地修修补补——从OP的角度来看,这是不公平和忘恩负义的。
Producer
Consumer
thread1 generated item 1
thread2 consumed item : 1
thread1 generated item 2
thread3 consumed item : 2
thread1 generated item 3
thread4 consumed item : 3
thread1 generated item 4
thread4 consumed item : 4
thread1 generated item 5
thread2 consumed item : 5
thread1 generated item 6
thread2 consumed item : 6
thread1 generated item 7
thread4 consumed item : 7
thread1 generated item 8
thread4 consumed item : 8
thread1 generated item 9
thread2 consumed item : 9
*** producer thread1 finished work
*** consumer thread3 finished work
*** consumer thread2 finished work
*** consumer thread4 finished work