我正在试图找出以下模块正在做什么。
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
的原因是什么?
答案 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()
没有的缺点。例如BufferedReadQueue
,NotImplementedError
使用is not reliable with multiprocessing.Queue
:
返回队列的大致大小。由于多线程/多处理语义,这个数字不可靠。
请注意,这可能会在Mac OS X等未实现
sem_getvalue()
的Unix平台上引发Queue.Queue
。
也可以内省multiprocessing.Queue
,并查看其内容而不会弹出它们。使用{{1}}无法做到这一点。