Python:为什么Queue.queue的某些方法"不可靠"?

Ram*_*hum 7 python queue multithreading

在该模块的queue类中Queue,有一些方法,即qsize,empty并且full,其文档声称它们"不可靠".

对他们究竟什么不可靠?

我注意到在Python文档站点上,有以下内容qsize:

注意,qsize()> 0不保证后续的get()不会阻塞,qsize()<maxsize也不保证put()不会阻塞.

我个人并不认为这种行为"不可靠".但这是"不可靠"的意思,还是这些方法中存在一些更加险恶的缺陷?

Ale*_*lli 10

是的,文档在这里使用"不可靠"来传达这个含义:例如,从某种意义上说,qsize并没有告诉你"现在"有多少条目,这个概念在多线程世界中不一定非常有意义(除了在采取同步预防措施的特定点之外) - 它告诉你"前一段时间"有多少条目...当你对该信息采取行动时,即使在下一个操作码中,队列也可能有更多条目,或者更少,或者根本没有,这取决于同时其他线程(如果有的话)---).

  • "不可靠"表明存在许多问题.对于某些用例,这些函数应该是完全可靠的(例如,从具有单个生成器线程的队列中检测插入是否可能阻塞)."不可靠"毫无意义. (3认同)
  • 当调用程序线程持有互斥锁时,它的大小"返回" - 它作为`return`的一部分被释放(在`finally`中); 这比调用者线程中的调用代码接收结果的瞬间更早."现在"是将结果绑定到变量或以任何其他方式使用的瞬间:到那时,绑定或以其他方式使用的结果可能已经过时. (3认同)
  • @Alex Martelli:qsize 报告的大小怎么可能不是现在的大小?毕竟,qsize 的调用者持有互斥锁,这意味着它是那个时刻唯一访问队列的线程。还是使用“现在”一词,如“在您完成调用 qsize 之后就对”? (2认同)

use*_*876 2

我不知道你指的是哪个队列模块,请问可以提供链接吗?

一种可能的不可靠性来源:通常,队列由一个线程读取并由另一个线程写入。如果您是访问队列的唯一线程,则可以可靠地实现 qsize()、empty() 和 full()。但是一旦其他线程介入,这些方法的返回值在您测试时可能已经过时了。