gpt4 book ai didi

python - multiprocessinq.Queue 作为 Queue.Queue 子级的属性

转载 作者:太空宇宙 更新时间:2023-11-03 18:09:58 28 4
gpt4 key购买 nike

我试图弄清楚以下模块正在做什么。

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 where sem_getvalue() is not implemented.

也可以内省(introspection) Queue.Queue ,并在不弹出内容的情况下查看其内容。这对于 multiprocessing.Queue 来说是不可能的。 .

关于python - multiprocessinq.Queue 作为 Queue.Queue 子级的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com