Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python multiprocessinq.Queue作为Queue.Queue子级的属性_Python_Multithreading_Queue_Multiprocessing - Fatal编程技术网

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”中读过它。今天早些时候,我确实读过(在同一本书中)队列。队列是一个古老的类。