我试图弄清楚下面的模块在做什么。
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的原因是什么?
发布于 2014-10-02 19:23:17
看起来,BufferedReadQueue被用作将multiprocessing.Queue的读取端转换为普通Queue.Queue的一种方法。注意这一点在__init__中
self.__listener = threading.Thread(target=self.listen)
self.__listener.setDaemon(True)
self.__listener.start()这将启动一个侦听器线程,该线程只是不断地尝试从内部get项目到self,然后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没有的缺点。例如,BufferedReadQueue使用的qsize(),multiprocessing.Queue
返回队列的大致大小。由于多线程/多处理语义,这个数字是不可靠的。 请注意,这可能会在Mac等未实现
sem_getvalue()的Unix平台上引发sem_getvalue()。
还可以对Queue.Queue进行内省,并在不弹出内容的情况下查看它的内容。这在multiprocessing.Queue中是不可能的。
https://stackoverflow.com/questions/26167797
复制相似问题