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