Python: 为什么Queue.queue的一些方法“不可靠”?

13 投票
3 回答
3972 浏览
提问于 2025-04-15 13:43

Queue模块的queue类中,有几个方法,比如qsizeemptyfull,它们的说明说这些方法“不是很可靠”。

那么,它们到底哪里不可靠呢?

我注意到在Python文档网站上,关于qsize有这样的说明:

注意,qsize()大于0并不能保证后续的get()不会被阻塞,qsize()小于最大值也不能保证put()不会被阻塞。

我个人并不认为这种行为是“不可靠”的。那这是不是指的“可靠性不高”,还是这些方法还有其他更严重的问题呢?

3 个回答

0

这是一个关于不可靠性的例子,正如Alex Martelli所提到的那样:JoinableQueue.empty()不可靠?有什么替代方案?

2

我不知道你指的是哪个队列模块,可以给我一个链接吗?

一个可能导致不可靠的原因是:通常,一个队列是由一个线程读取,另一个线程写入。如果只有你一个线程在访问这个队列,那么qsize()、empty()和full()这些方法的可靠实现是可能的。但一旦有其他线程参与进来,当你测试这些方法的返回值时,它们可能已经过时了。

14

是的,文档中提到的“可靠性差”就是这个意思:比如说,qsize 并不能告诉你“现在”有多少个条目,这个概念在多线程的环境中并不一定很有意义(除非在某些特定的时刻你采取了同步措施)。它其实是告诉你“之前”有多少个条目……当你根据这个信息进行操作时,即使是在下一条指令中,队列里的条目数量可能会变多、变少,甚至可能没有条目,这都取决于其他线程在这段时间里做了什么(如果有的话;-)。

撰写回答