这个生产者消费者代码有什么问题?

时间:2012-03-22 13:47:54

标签: python multiprocessing

我修改了an example with threads并得到了下面包含多处理的示例。我的问题是ProduceToQueue运行正常,但是ConsumeFromQueue没有完成。为什么?这是我的第一个多处理程序之一,请耐心等待。

from Queue import Queue
import multiprocessing
import random
import time


class ProduceToQueue(multiprocessing.Process):
    def __init__(self, queue):
        multiprocessing.Process.__init__(self)
        self.shared_queue = queue

    def run(self):
        for i in range(11, 21):
            time.sleep(random.randrange(5))
            print "%s adding %s to queue" % (self.name, i)
            self.shared_queue.put(i)

        print self.name, "finished producing values"
        print "Terminating", self.name


class ConsumeFromQueue(multiprocessing.Process):
    def __init__(self, queue):
        multiprocessing.Process.__init__(self)
        self.shared_queue = queue

    def run(self):
        value = 0
        current = 10
        for i in range(10):
            time.sleep(random.randrange(3))
            print "%s attempting to read %s..." % (self.name, current + 1)
            current = self.shared_queue.get()
            print "%s read %s" % (self.name, current)
            value += current

            print "%s retrieved values totaling: %d" % (self.name, value)
            print "Terminating", self.name


queue = Queue()
producer = ProduceToQueue(queue)
consumer = ConsumeFromQueue(queue)

producer.start()
consumer.start()

producer.join()
consumer.join()

2 个答案:

答案 0 :(得分:3)

您正在使用Queue.Queue。对于多处理内容,您应该使用multiprocessing.Queue

答案 1 :(得分:1)

如果您使用的是multiprocessing而不是threading,那么您应该使用Queue中的multiprocessing类,因为它是在进程间正确共享的类。有关详细信息,请参阅the Python docs on the multithreading module

每当您创建子进程时,标准Queue类(来自Queue)将有效地拆分为两个单独的队列。这意味着,在您的情况下,您在主进程中有队列(没有人接触),生成器中的不同的队列(正在写入)而另一个消费者中的em>队列(正在读取)。

这三者之间没有任何联系。

最快的解决方法是简单地改变:

from Queue import Queue

成:

from multiprocessing import Queue

这样你的队列就可以在进程之间工作,而不仅仅是线程。或者只是完全摆脱from行并使用:

queue = multiprocessing.Queue()

此外(尽管我意识到这只是游戏代码),在消费者中进行睡眠操作是非常不寻常的,你通常希望在项目出现在队列中时保持准备就绪。