gpt4 book ai didi

Python 3 : Will Queue. empty() 是正确的,如果一段时间内没有线程放入或取出元素?

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:13 35 4
gpt4 key购买 nike

我在 Python 3.7 (Windows 10) 中使用 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.

现在让我们想象一下,从计时器滴答 t4 开始,我们绝对确定队列没有被任何线程触及 - 没有元素被插入,也没有任何元素被拉出。

也许在计时器滴答 t4 时,队列还没有时间在内部稳定下来,Queue.empty() 的返回值是错误的。但它会在一段时间后稳定下来吗,比如在计时器滴答 t5t6 时?


可能性一:不,它永远不会稳定
这真是太可怕了。我永远不会再使用这个队列。故事结束。


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


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

最佳答案

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

Queue.empty() 方法根据队列的当前状态 返回 True 或 False。问题在于,当另一个线程获得控制权并与队列交互时,该状态可以随时更改,因此在一个线程内,除非其他同步原语(锁,信号量,事件,条件,障碍,你有什么),您不能在任何时间段内依赖返回值。

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

同样适用于Queue.qsize()方法;返回值不是模糊的或近似的,它是当时队列状态的准确度量。但是,由于当控制权转移到另一个线程时,您的代码可能并且将会被中断,因此您不能依赖该度量来告知您的代码随后如何对队列进行操作,因为到下一个时间您线程中的指令可能对该测量起作用,控制可能已被切换并再次返回,另一个线程可能对队列起作用,并且测量不再相关。

如果您需要更明确的东西,请使用其他同步原语在您的线程之间进行通信。

关于Python 3 : Will Queue. empty() 是正确的,如果一段时间内没有线程放入或取出元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54026122/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com