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

2024-09-28 01:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()

Tags: nameimportselftimequeueinitdefrandom
2条回答

您正在使用Queue.Queue。对于多处理的内容,您应该使用^{}。在

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

无论何时创建子进程,标准的Queue类(来自Queue)将有效地分成两个独立的队列。这意味着,在您的情况下,您在主进程中有一个队列(没有人会接触它),在生产者中有一个不同的队列(正在写入),而消费者中的另一个队列(正在从中读取)。在

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

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

from Queue import Queue

进入:

^{pr2}$

这样,队列的类型就可以在进程之间而不仅仅是线程之间工作。或者干脆去掉from行,然后使用:

queue = multiprocessing.Queue()

另外(虽然我意识到这只是播放代码),但在消费者中进行睡眠操作是非常不寻常的,通常您只需要为队列中出现的项目做好准备。在

相关问题 更多 >

    热门问题