首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >multiprocessinq.Queue作为Queue.Queue子属性

multiprocessinq.Queue作为Queue.Queue子属性
EN

Stack Overflow用户
提问于 2014-10-02 19:05:48
回答 1查看 122关注 0票数 1

我试图弄清楚下面的模块在做什么。

代码语言:javascript
复制
import Queue
import multiprocessing
import threading

class BufferedReadQueue(Queue.Queue):
    def __init__(self, lim=None):
        self.raw = multiprocessing.Queue(lim)
        self.__listener = threading.Thread(target=self.listen)
        self.__listener.setDaemon(True)
        self.__listener.start()
        Queue.Queue.__init__(self, lim)

    def listen(self):
        try:
            while True:
                self.put(self.raw.get())
        except:
            pass

    @property
    def buffered(self):
        return self.qsize()

它只在调用代码中实例化一次,.raw属性multiprocessing.Queue被发送到另一个类,该类似乎是从multiprocessing.Process继承的。

因此,正如我所看到的,BufferedReadQueue的一个属性被用作队列,而不是类(或它的实例)本身。

如果BufferedReadQueue不是真正用作队列,那么它继承自Queue.Queue而不仅仅是object的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-02 19:23:17

看起来,BufferedReadQueue被用作将multiprocessing.Queue的读取端转换为普通Queue.Queue的一种方法。注意这一点在__init__

代码语言:javascript
复制
    self.__listener = threading.Thread(target=self.listen)
    self.__listener.setDaemon(True)
    self.__listener.start()

这将启动一个侦听器线程,该线程只是不断地尝试从内部get项目到self,然后put将所有这些项都发送到self。看起来用例是这样的:

代码语言:javascript
复制
def func(queue):
   queue.put('stuff')
   ...

buf_queue = BufferedReadQueue()
proc = multiprocessing.Process(target=func, args=(buf_queue.raw,))
proc.start()
out = buf_queue.get()  # Only get calls in the parent

现在,为什么要这样做而不是直接使用multiprocessing.Queue呢?可能是因为multiprocessing.Queue有一些Queue.Queue没有的缺点。例如,BufferedReadQueue使用的qsize()multiprocessing.Queue

返回队列的大致大小。由于多线程/多处理语义,这个数字是不可靠的。 请注意,这可能会在Mac等未实现sem_getvalue()的Unix平台上引发sem_getvalue()

还可以对Queue.Queue进行内省,并在不弹出内容的情况下查看它的内容。这在multiprocessing.Queue中是不可能的。

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

https://stackoverflow.com/questions/26167797

复制
相关文章

相似问题

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