我有一个创建类的脚本,并尝试在单独的进程中启动该类的对象
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”。我做错了什么
问题是您使用的是^{} ,它只处理同一进程中的多个线程,而不是多个进程
multiprocessing
模块自带了它自己的替代品^{有关更多详细信息,请参见
multiprocessing
文档中的Pipes and Queues,但您可能不需要更多详细信息;multiprocessing.Queue
意味着尽可能接近Queue.Queue
的多进程克隆如果您想了解封面下的差异:
A
Queue.Queue
是一个包含条件变量的deque。它依赖于一个事实,即运行在同一解释器中的代码可以访问相同的对象来共享deque,并使用条件变量来保护deque不受竞争和信令的影响multiprocessing.Queue
是一种更为复杂的事情,它对对象进行pickle处理,并通过进程之间的管道传递对象。种族不是问题,但信号仍然是问题,因此它也有条件变量的等价物,但显然不是来自threading
的条件变量相关问题 更多 >
编程相关推荐