为什么没有为队列实现len()?

时间:2017-12-01 01:35:36

标签: python multithreading queue language-design

内置函数len()https://docs.python.org/3/library/functions.html#len)返回“对象的长度(项目数)”,但{{ 1}}(https://docs.python.org/3/library/queue.html)。 相反,queue.Queue有一个queue.Queue方法,当它显然有一个长度时,它会返回队列的大致大小;您可以在构造函数中指定qsize()的最大长度。类似的Queue适用于collections.deque

len不使用通用len()的原因是什么?或者:如果queue.Queue被命名为qsize以启用__len__功能,会出现什么问题?

1 个答案:

答案 0 :(得分:11)

len()并未针对queue.Queue实施,因为这将是一个非常有吸引力的滋扰":只有专家才应该考虑使用的东西,但是&#34友好的名字"会鼓励非专家使用它。

与大多数序列类型(如listdeque)不同,queue.Queue特别是意图用于多线程上下文(同样适用于multiprocessing模块的队列类型)。虽然Queue中的项目数量在任何特定时间肯定具有明确的价值,但用户代码无法找出该值是什么:在调用.qsize()之间的时间返回并且您的代码可以查看返回的值,任何数量的其他线程(或multiprocessing情况下的进程)可能对队列进行了任意数量的更改内容。

关于.qsize()返回的值,唯一可以说的是,Queue em>过去的时间。当您可以使用返回的值时,它可能具有任意更多(或更少)的值。

当然,如果你只运行一个帖子,情况就不是这样了 - 但是那时候没有必要为Queue的实现复杂性付费(使用一个{{ 1}}或list代替。)