如果我使用Queue.Queue
,那么我的read()
功能无效,为什么?但是,如果我使用multiprocessing.Queue
,它运作良好:
from multiprocessing import Pool, Process, Queue
import os, time
# from Queue import Queue
def write(q):
for v in ['A', 'B', 'C']:
print 'Put %s to queue ' % v
q.put_nowait(v)
time.sleep(0.2)
def read(q):
while 1:
if not q.empty():
v = q.get(True)
print "Get %s from queue" % v
time.sleep(0.2)
else:
break
if __name__ == '__main__':
q = Queue()
pw = Process(target=write, args=(q, ))
pr = Process(target=read, args=(q, ))
pw.start()
pw.join()
pr.start()
pr.join()
print "all done..."
答案 0 :(得分:23)
Queue.Queue
只是一个内存中的队列,它知道如何同时处理多个线程。只有当生产者和消费者都在同一个过程中时,它才有效。
一旦你将它们放在单独的系统进程中,这就是multiprocessing
库的含义,事情就会复杂一点,因为进程不再共享相同的内存。您需要某种进程间通信方法,以允许两个进程相互通信。它可以是共享内存,管道或套接字,也可能是其他内容。这就是multiprocessing.Queue
的作用。它使用管道为两个进程提供通信的方式。它恰好实现了与Queue.Queue
相同的API,因为大多数Python程序员已经熟悉它。
另请注意,您使用队列的方式,您的程序中存在竞争条件。想一想,如果write
进程在q.empty()
进程中调用read
后立即写入队列,会发生什么。通常你会在队列中添加一些特殊项目(例如None
),这意味着消费者可以停止。