Python: 为什么Queue.queue的一些方法“不可靠”?
在Queue
模块的queue
类中,有几个方法,比如qsize
、empty
和full
,它们的说明说这些方法“不是很可靠”。
那么,它们到底哪里不可靠呢?
我注意到在Python文档网站上,关于qsize
有这样的说明:
注意,
qsize()
大于0并不能保证后续的get()
不会被阻塞,qsize()
小于最大值也不能保证put()
不会被阻塞。
我个人并不认为这种行为是“不可靠”的。那这是不是指的“可靠性不高”,还是这些方法还有其他更严重的问题呢?
3 个回答
0
这是一个关于不可靠性的例子,正如Alex Martelli所提到的那样:JoinableQueue.empty()不可靠?有什么替代方案?
2
我不知道你指的是哪个队列模块,可以给我一个链接吗?
一个可能导致不可靠的原因是:通常,一个队列是由一个线程读取,另一个线程写入。如果只有你一个线程在访问这个队列,那么qsize()、empty()和full()这些方法的可靠实现是可能的。但一旦有其他线程参与进来,当你测试这些方法的返回值时,它们可能已经过时了。
14
是的,文档中提到的“可靠性差”就是这个意思:比如说,qsize
并不能告诉你“现在”有多少个条目,这个概念在多线程的环境中并不一定很有意义(除非在某些特定的时刻你采取了同步措施)。它其实是告诉你“之前”有多少个条目……当你根据这个信息进行操作时,即使是在下一条指令中,队列里的条目数量可能会变多、变少,甚至可能没有条目,这都取决于其他线程在这段时间里做了什么(如果有的话;-)。