首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >multiprocessing.Queue和Queue.Queue是不同的?

multiprocessing.Queue和Queue.Queue是不同的?
EN

Stack Overflow用户
提问于 2015-05-18 03:15:56
回答 1查看 8.7K关注 0票数 18

如果我使用Queue.Queue,那么我的read()函数就不能工作,为什么?但是如果我使用multiprocessing.Queue,它会运行得很好:

代码语言:javascript
复制
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..."
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-18 03:26:44

Queue.Queue只是一个内存中的队列,它知道如何同时处理多个线程。只有当生产者和消费者都在同一过程中时,它才能起作用。

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

还请注意,在使用队列的方式中,程序中有一个争用条件。考虑一下,如果write进程在调用read进程中的q.empty()之后立即写入队列,会发生什么情况。通常,您会向队列中添加一些特殊项(例如None),这意味着使用者可以停止。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30294571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档