多进程消息队列未接收消息

时间:2018-03-14 20:08:41

标签: python multiprocess

我有一个创建类的脚本,并尝试在单独的进程中启动该类的对象;

class Task():
  def __init__(self, messageQueue):
    self.messageQueue = messageQueue

  def run(self):
    startTime = time.time()
    while time.time() -startTime < 60:
      try:
        message = self.messageQueue.get_nowait()
        print message
        self.messageQueue.task_done()
      except Queue.Empty:
        print "No messages"
      time.sleep(1)

def test(messageQueue):
  task = Task(messageQueue)
  task.run()

if __name__ == '__main__':
  messageQueue = Queue.Queue()
  p = Process(target=test, args=(messageQueue,))
  p.start()
  time.sleep(5)
  messageQueue.put("hello")

而不是看到消息&#34;你好&#34;在5秒后打印出来,我只是连续不断地发出消息&#34;我究竟做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是你正在使用Queue.Queue,它只处理同一进程中的多个线程,而不是多个进程。

multiprocessing模块附带了自己的替换multiprocessing.Queue,它提供相同的功能,但可以与 线程和进程一起使用。

有关详细信息,请参阅multiprocessing文档中的Pipes and Queues,但您可能不需要更多详细信息; multiprocessing.Queue旨在尽可能接近Queue.Queue的多进程克隆。

如果您想了解隐藏的差异:

Queue.Queue是一个带有条件变量的双端队列。它依赖于以下事实:在同一个解释器中运行的代码可以访问相同的对象来共享deque,并使用条件变量来保护deque免受竞争以及信令的影响。

multiprocessing.Queue是一个更复杂的事情,它会腌制对象并将它们传递到进程之间的管道上。种族不是问题,但信号仍然存在,因此它也具有条件变量的等价物,但显然不是来自threading的那些。