multiprocessinq.Queue作为Queue.Queue子属性

时间:2014-10-02 19:05:48

标签: python multithreading queue multiprocessing

我正在试图找出以下模块正在做什么。

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实际上没有被用作队列,那么BufferedReadQueue从Queue.Queue继承而不只是object的原因是什么?

1 个答案:

答案 0 :(得分:1)

BufferedReadQueue似乎是用来将multiprocessing.Queue的读取结果转换为普通Queue.Queue的方法。请注意__init__

    self.__listener = threading.Thread(target=self.listen)
    self.__listener.setDaemon(True)
    self.__listener.start()

这将启动一个侦听器线程,该线程不断尝试从内部get multiprocessing.Queue项,然后put将所有这些项目self转移到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有一些qsize()没有的缺点。例如BufferedReadQueueNotImplementedError使用is not reliable with multiprocessing.Queue

  

返回队列的大致大小。由于多线程/多处理语义,这个数字不可靠。

     

请注意,这可能会在Mac OS X等未实现sem_getvalue()的Unix平台上引发Queue.Queue

也可以内省multiprocessing.Queue,并查看其内容而不会弹出它们。使用{{1}}无法做到这一点。