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

cdj*_*djc 11 python queue multithreading language-design

内置函数len()(https://docs.python.org/3/library/functions.html#len)返回" 的对象的长度(项目数) ",但这不是用于实现queue.Queue(HTTPS: //docs.python.org/3/library/queue.html).相反,queue.Queue有一个qsize()方法,当它显然有一个长度时返回队列的近似大小; 您可以Queue在构造函数中指定a的最大长度.类似collections.deque的确合作len.

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

Tim*_*ers 11

len()没有实施,queue.Queue因为它会是一个"有吸引力的滋扰":只有专家才应该考虑使用,但"友好名称"会鼓励非专家使用它.

不像大多数序列类型(如listdeque),一个queue.Queue是专门打算在多线程环境中使用(并且类似地对于multiprocessing模块的队列类型).虽然a中的项目数量Queue肯定在任何特定时间具有确定的值,但是用户代码不可能找出该值是什么:在.qsize()返回调用和代码可以查看返回值之间的任何数量,其他线程(或者在这种multiprocessing情况下的进程)可能对队列的内容进行了任意数量的更改.

所以,唯一真实的东西,可以通过左右返回的值可以说.qsize()的是,Queue 它的许多价值观在一些过去的时间.当您可以使用返回的值时,它可能具有任意更多(或更少)的值.

当然,如果你只运行一个线程,情况并非如此 - 但是没有必要为a的实现复杂性付费Queue(使用a list或者deque代替).

  • 如果我写的话,他们不会实现`empty()`和`full()`;-)在早期,各种可选的`timeout =`参数不存在,而`full()`和` empty()`在循环中用作_probabilistic_ gimmicks来判断`.put()`或`.get()`是否"可能"成功.使用它们的代码(比如使用`qsize()`的代码)经常不容易出现计时错误. (5认同)
  • 我不是专家,因此一个简单且最不令人惊讶的“len()”对我来说听起来比深思熟虑的“qsize()”更好。“len”的细节和可能的不准确可以在帮助消息中解释,这对于程序员来说应该足够了。 (3认同)