我使用的是python3.7(windows10)中的queue.Queue()
。有时我需要检查队列是否为空。文件内容如下:
Queue.empty()
ReturnTrue
if the queue is empty,False
otherwise. Ifempty()
returnsTrue
it doesn’t guarantee that a subsequent call toput()
will not block. Similarly, ifempty()
returns False it doesn’t guarantee that a subsequent call toget()
will not block.
换句话说,不能完全100%依赖于Queue.empty()
的返回值。我觉得这很自然。在多线程环境中,当您询问某个元素是否为空时,某个副线程就可以潜入并将其放入队列中。因此,返回的答案是不可靠的。我明白了。你知道吗
但是下面的场景呢?计时器滴答滴答:t1
,t2
,t3
。。。在计时器的每一个滴答声中,队列都会被问到:“你是空的吗?”?你知道吗
t1 t2 t3 t4 t5 t6
---|--------|--------|--------|--------|--------|--------->
\__________ __________/\__________ ___________/
\/ \/
Different threads No action on
put elements on the the queue.
queue and/or pull
elements from it.
现在让我们设想一下,从timer tickt4
开始,我们绝对确定队列没有被任何线程触及-没有元素被插入,也没有任何元素被拉出。你知道吗
也许在计时器滴答声t4
时,队列还没有时间在内部稳定,来自Queue.empty()
的返回值是错误的。但它会在一段时间后稳定下来吗,比如说在计时器滴答声t5
或t6
?你知道吗
可能性1:不,它永远不会稳定
太可怕了。我再也不用这个队列了。故事结束了。你知道吗
可能性2:是的,它在x
毫秒后稳定
我知道你不能在这里给出确切的答案。它将取决于许多因素:操作系统、硬件、占用资源的线程数量。。。但如果能知道一段时间后它会稳定下来那就太好了。我只需要足够的保证金。你知道吗
注:
如果Queue.empty()
在一段时间后稳定(或不稳定),我想Queue.qsize()
也是如此,对吧?你知道吗
它会稳定下来。当没有线程与队列交互时,就不可能再出现争用条件。你知道吗
Queue.empty()
方法根据队列的当前状态返回True或False。有争议的是,当另一个线程被赋予控制权并与队列交互时,这种状态随时都可能发生变化,因此在一个线程中,除非使用其他同步原语(锁、信号量、事件、条件、障碍等),否则在任何时间长度内都不能依赖返回值。你知道吗因此没有时间段,你可以指望状态稳定。队列对象中没有“不稳定状态”,只有在整个应用程序中,因为您使用的是线程。你知道吗
这同样适用于
Queue.qsize()
方法;返回值不是模糊的或近似的,它是对当时队列状态的精确度量。但是,由于当控制转移到另一个线程时,您的代码可能会被中断,因此您不能依赖于该度量来通知代码如何对队列执行操作,因为当线程中的下一条指令可以对该度量执行操作时,控制可能已经被关闭并重新切换,另一个线程可能对队列执行了操作,并且度量不再相关。你知道吗如果需要更明确的内容,请使用其他同步原语在线程之间进行通信。你知道吗
相关问题 更多 >
编程相关推荐