我有一个创建类的脚本,并尝试在单独的进程中启动该类的对象;
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;我究竟做错了什么?
答案 0 :(得分:3)
问题是你正在使用Queue.Queue
,它只处理同一进程中的多个线程,而不是多个进程。
multiprocessing
模块附带了自己的替换multiprocessing.Queue
,它提供相同的功能,但可以与 线程和进程一起使用。
有关详细信息,请参阅multiprocessing
文档中的Pipes and Queues,但您可能不需要更多详细信息; multiprocessing.Queue
旨在尽可能接近Queue.Queue
的多进程克隆。
如果您想了解隐藏的差异:
Queue.Queue
是一个带有条件变量的双端队列。它依赖于以下事实:在同一个解释器中运行的代码可以访问相同的对象来共享deque,并使用条件变量来保护deque免受竞争以及信令的影响。
multiprocessing.Queue
是一个更复杂的事情,它会腌制对象并将它们传递到进程之间的管道上。种族不是问题,但信号仍然存在,因此它也具有条件变量的等价物,但显然不是来自threading
的那些。