Python multiprocessinq.Queue作为Queue.Queue子级的属性
我试图弄清楚下面的模块在做什么Python multiprocessinq.Queue作为Queue.Queue子级的属性,python,multithreading,queue,multiprocessing,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)
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而不仅仅是
对象的原因是什么?看起来BufferedReadQueue
是用来将多处理.Queue
的读取端转换为正常的队列.Queue
。请在\uuuu init\uuuu
中注意这一点:
self.__listener = threading.Thread(target=self.listen)
self.__listener.setDaemon(True)
self.__listener.start()
这将启动一个侦听器线程,它只是不断尝试从内部多处理队列获取项,然后将所有这些项放入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
现在,为什么要这样做,而不是直接使用多处理.Queue
?可能是因为multiprocessing.Queue
有一些Queue.Queue
没有的缺点。例如,BufferedReadQueue
使用的qsize()
:
返回队列的大致大小。由于多线程/多处理语义,此数字不可靠
请注意,在Mac OS X等Unix平台上,如果未实现sem_getvalue()
,则可能会引发NotImplementedError
还可以内省队列。队列
,并在不弹出的情况下查看其内容。这在多处理.Queue
中是不可能的,我看到.buffered
在某一点被调用。我仍然对房地产装饰师感到困惑。在本例中,.buffered
类似于说self.buffered=self.qsize()
,但使其成为只读属性?@MikeiLL出于任何原因,作者决定使用buf_queue.buffered
而不是buf_queue.qsize()
。可能是因为对象是对象缓冲区的抽象,而不是对象队列,而缓冲
应该理解为“缓冲了多少对象”。或者,他们可能希望将来能够更改BufferedReadQueue
的内部实现,这可能意味着buffered
的值不再是qsize()
。在Queue.Queue.\uu init\uuuuself(lim)
发生了什么?这实际上是将Queue.Queue(lim)
的实例分配给BufferedReadQueue
的实例吗?@MikeiLL它只是调用父类的构造函数BufferedReaderQueue
是Queue.Queue
的子级,因此它需要调用Queue.Queue
的\uuuuu init\uuuu
,以便正确初始化它。这只是标准的面向对象编程。您可能更习惯于查看super(BufferedReaderQueue,self)。\uuuu init\uuuuuu(limt)
,但我认为Queue.Queue
在Python2.x中是一个老式的类,所以您不能使用super
。我不想说我已经习惯于看到这些,但我隐约记得在“简而言之的Python”中读过它。今天早些时候,我确实读过(在同一本书中)队列。队列是一个古老的类。