multiprocessing.Queue和Queue.Queue有什么不同?

Mug*_*uge 10 python multiprocessing

如果我使用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..."
Run Code Online (Sandbox Code Playgroud)

Luk*_*ský 24

Queue.Queue只是一个内存中的队列,它知道如何同时使用它来处理多个线程.它只适用于生产者和消费者都在同一个过程中.

一旦你将它们放在单独的系统进程中,这就是multiprocessing库所关注的事情,事情就会复杂一些,因为这些进程不再共享相同的内存.您需要某种进程间通信方法,以允许两个进程相互通信.它可以是共享内存,管道或套接字,也可能是其他内容.这是做什么的multiprocessing.Queue.它使用管道为两个进程提供通信的方式.它恰好实现了相同的API Queue.Queue,因为大多数Python程序员已经熟悉它.

另请注意,您使用队列的方式,您的程序中存在竞争条件.想想,如果发生了什么write进程写入给你打电话后立即队列q.empty()read过程.通常你会在队列中添加一些特殊项目(例如None),这意味着消费者可以停止.

  • 关于 multiprocessing.Queue 的一个仅供参考(作为与queue.Queue 的行为差异):插入队列的数据*必须*被读出。如果一个进程写入队列并稍后终止,则在另一个进程获取队列中的项目之前,它实际上不会终止。 (2认同)