我试图弄清楚以下模块正在做什么。
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
的原因是什么?
最佳答案
看起来像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
使用,is not reliable with multiprocessing.Queue
:
Return the approximate size of the queue. Because of multithreading/multiprocessing semantics, this number is not reliable.
Note that this may raise
NotImplementedError
on Unix platforms like Mac OS X wheresem_getvalue()
is not implemented.
也可以内省(introspection) Queue.Queue
,并在不弹出内容的情况下查看其内容。这对于 multiprocessing.Queue
来说是不可能的。 .
关于python - multiprocessinq.Queue 作为 Queue.Queue 子级的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167797/