问题描述
与queue.Queue相反,multiprocessing.Queue似乎没有maxsize属性。当我尝试通过调用queue_object.maxsize
获得最大大小时,出现以下异常:AttributeError: 'Queue' object has no attribute 'maxsize'
。
这是我这方面的实现错误,还是实际上不存在?如果不存在,还有另一种方式来获取此信息吗?
如何复制:
Python 3.7.6 (v3.7.6:43364a7ae0,Dec 18 2019,14:18:50)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help","copyright","credits" or "license" for more @R_112_4045@ion.
>>> from multiprocessing import Queue
>>> q = Queue(maxsize=10)
>>> q.maxsize
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
AttributeError: 'Queue' object has no attribute 'maxsize'
编辑: 如以下答案中所述,不支持此属性,这使我想到一个问题,为什么会这样呢?我相信multiprocessing.Queue基于不支持属性的queue.Queue(首先导致混乱)。
解决方法
multiprocessing.Queue
复制queue.Queue
中记录的API。它不花力气重复实现细节。
maxsize
实例的queue.Queue
属性是未记录的实现细节。缺少前面的下划线不会使其公开。用户从未打算与此属性进行交互。不保证它会存在于所有Python实现中,也不会保证会存在于将来的版本中。 (例如,如果queue
模块曾经获得C实现,则该属性很可能消失。)
获取multiprocessing.Queue
的最大大小的预期方法是跟踪创建对象时传递的值。如果确定直接从队列对象中删除它,并且可以访问实现详细信息(就像在maxsize
中对queue.Queue
所做的那样),则可以访问当前实现的private属性用途:
queue._maxsize
不能保证这会在将来的版本或其他Python实现中起作用。
,我发现了一种变通方法,如在多处理的source code中所见,该属性被设置为私有属性。因此,要访问它,只需执行queue_object._maxsize
。不过,这不是一个优雅的解决方案,我想知道为什么要这样实现。
Python 3.7.6 (v3.7.6:43364a7ae0,Dec 18 2019,14:18:50)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help","copyright","credits" or "license" for more information.
>>> from multiprocessing import Queue
>>> q = Queue(maxsize=10)
>>> q._maxsize
10
,
如文档所述:
'''Return the approximate size of the queue (not reliable!).'''
queue = Queue()
queue.qsize()
还有另一篇文章可以在这里回答您的问题:Another answer。
因此,您还可以创建自己的队列,并使用 lock.acquired 和 lock.release 捕获当前大小。以下示例是一个自定义设置队列,但您也可以使用列表。
class SetQueue(Queue):
def _init(self,maxsize):
self.queue = set()
def _put(self,item):
self.queue.add(item)
def _get(self):
return self.queue.pop()