多进程消息队列收不到消息

Multiprocess message queue not receiving messages

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

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

我没有看到消息 "hello" 在 5 秒后打印出来,而是得到了连续的 "No messages" 流。我究竟做错了什么?

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

multiprocessing 模块有自己的替代品,multiprocessing.Queue,它提供相同的功能,但与 线程和进程一起工作。

有关详细信息,请参阅 multiprocessing 文档中的 Pipes and Queues — 但您可能不需要更多详细信息; multiprocessing.Queue 意味着尽可能接近 Queue.Queue 的 multi-process 克隆。


如果你想了解under-the-covers的区别:

A Queue.Queue 是一个包含条件变量的双端队列。它依赖于同一解释器中的代码 运行 可以访问相同对象以共享双端队列这一事实,并使用条件变量来保护双端队列免受竞争以及信号传输。

A multiprocessing.Queue 是一个更复杂的事情,它会腌制对象并通过进程之间的管道传递它们。种族不是问题,但信号仍然是,所以它也有条件变量的等价物,但显然不是 threading.

中的那些