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

2024-05-13 14:59:27 发布

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

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

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

我没有看到5秒钟后打印出来的消息“hello”,而是看到了连续不断的“No messages”。我做错了什么


Tags: noruntestselfmessagetasktimequeue
1条回答
网友
1楼 · 发布于 2024-05-13 14:59:27

问题是您使用的是^{},它只处理同一进程中的多个线程,而不是多个进程

multiprocessing模块自带了它自己的替代品^{},它提供了相同的功能,但同时与线程和进程一起工作

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


如果您想了解封面下的差异:

AQueue.Queue是一个包含条件变量的deque。它依赖于一个事实,即运行在同一解释器中的代码可以访问相同的对象来共享deque,并使用条件变量来保护deque不受竞争和信令的影响

multiprocessing.Queue是一种更为复杂的事情,它对对象进行pickle处理,并通过进程之间的管道传递对象。种族不是问题,但信号仍然是问题,因此它也有条件变量的等价物,但显然不是来自threading的条件变量

相关问题 更多 >