我修改了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()
您正在使用} 。在
Queue.Queue
。对于多处理的内容,您应该使用^{如果您使用的是
multiprocessing
而不是threading
,那么您应该使用来自multiprocessing
的Queue
类,因为它是在进程之间正确共享的类。有关详细信息,请参见the Python docs on the multithreading module。在无论何时创建子进程,标准的
Queue
类(来自Queue
)将有效地分成两个独立的队列。这意味着,在您的情况下,您在主进程中有一个队列(没有人会接触它),在生产者中有一个不同的队列(正在写入),而消费者中的另一个队列(正在从中读取)。在这三者之间没有任何联系。在
最快的解决方法是简单地改变:
进入:
^{pr2}$这样,队列的类型就可以在进程之间而不仅仅是线程之间工作。或者干脆去掉
from
行,然后使用:另外(虽然我意识到这只是播放代码),但在消费者中进行睡眠操作是非常不寻常的,通常您只需要为队列中出现的项目做好准备。在
相关问题 更多 >
编程相关推荐