多进程消息队列收不到消息
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
.
中的那些
我有一个创建 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
.