我想弄清楚下面的模塊正在做什麼。multiprocessinq.Queue作爲Queue.Queue子的屬性
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的一個屬性被用作Queue,但不是它的類(也不是它的一個實例)本身。
如果BufferedReadQueue實際上並未被用作隊列,那麼它會從Queue.Queue繼承而不僅僅是object
的原因是什麼?
我看到'.buffered'在一個點上被調用。我*仍然*對財產裝飾者感到困惑。在這種情況下,'.buffered'類似於說'self.buffered = self.qsize()',但使它成爲只讀屬性? – MikeiLL 2014-10-02 19:36:29
@MikeiLL無論出於何種原因,作者決定使用'buf_queue.buffered'而不是'buf_queue.qsize()'。也許是因爲該對象意味着是對象緩衝區的抽象,而不是對象隊列,而「緩衝」應該理解爲「有多少對象被緩衝」。或者也許他們希望能夠在將來改變'BufferedReadQueue'的內部實現,這可能意味着'buffered'的值不再是'qsize()'。 – dano 2014-10-02 19:54:29
'Queue.Queue .__ init __(self,lim)'發生了什麼?這是否基本上將'Queue.Queue(lim)'的實例分配給'BufferedReadQueue'的實例? – MikeiLL 2014-10-02 20:19:14