Python3:威尔队列.空()如果在一段时间内,没有线程放入或拉出元素,是否正确?

2024-06-23 19:59:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.7(windows10)中的queue.Queue()。有时我需要检查队列是否为空。文件内容如下:

Queue.empty()
Return True if the queue is empty, False otherwise. If empty() returns True it doesn’t guarantee that a subsequent call to put() will not block. Similarly, if empty() returns False it doesn’t guarantee that a subsequent call to get() will not block.

换句话说,不能完全100%依赖于Queue.empty()的返回值。我觉得这很自然。在多线程环境中,当您询问某个元素是否为空时,某个副线程就可以潜入并将其放入队列中。因此,返回的答案是不可靠的。我明白了。你知道吗

但是下面的场景呢?计时器滴答滴答:t1t2t3。。。在计时器的每一个滴答声中,队列都会被问到:“你是空的吗?”?你知道吗

   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()的返回值是错误的。但它会在一段时间后稳定下来吗,比如说在计时器滴答声t5t6?你知道吗


可能性1:不,它永远不会稳定 太可怕了。我再也不用这个队列了。故事结束了。你知道吗


可能性2:是的,它在x毫秒后稳定
我知道你不能在这里给出确切的答案。它将取决于许多因素:操作系统、硬件、占用资源的线程数量。。。但如果能知道一段时间后它会稳定下来那就太好了。我只需要足够的保证金。你知道吗


注:
如果Queue.empty()在一段时间后稳定(或不稳定),我想Queue.qsize()也是如此,对吧?你知道吗


Tags: thefalsetrue元素if队列queueit
1条回答
网友
1楼 · 发布于 2024-06-23 19:59:04

它会稳定下来。当没有线程与队列交互时,就不可能再出现争用条件。你知道吗

Queue.empty()方法根据队列的当前状态返回True或False。有争议的是,当另一个线程被赋予控制权并与队列交互时,这种状态随时都可能发生变化,因此在一个线程中,除非使用其他同步原语(锁、信号量、事件、条件、障碍等),否则在任何时间长度内都不能依赖返回值。你知道吗

因此没有时间段,你可以指望状态稳定。队列对象中没有“不稳定状态”,只有在整个应用程序中,因为您使用的是线程。你知道吗

这同样适用于Queue.qsize()方法;返回值不是模糊的或近似的,它是对当时队列状态的精确度量。但是,由于当控制转移到另一个线程时,您的代码可能会被中断,因此您不能依赖于该度量来通知代码如何对队列执行操作,因为当线程中的下一条指令可以对该度量执行操作时,控制可能已经被关闭并重新切换,另一个线程可能对队列执行了操作,并且度量不再相关。你知道吗

如果需要更明确的内容,请使用其他同步原语在线程之间进行通信。你知道吗

相关问题 更多 >

    热门问题