14

在qsize() 的文档中它说:返回队列的近似大小。

为什么它不能只返回这个队列的确切大小?我知道队列可能被多个线程访问,但是在我调用该函数的那一刻,我认为仍然可以返回那个时刻的确切大小。

4

2 回答 2

36

正是因为有其他线程在访问它。当您尝试使用从 qsize() 返回的大小时,队列可能已经改变。如果文档阅读如下内容会更好:

返回队列的大小。请注意,在多线程环境中,大小可以随时更改,这只是实际大小的近似值。

于 2012-07-21T11:58:52.490 回答
5

我同意“近似”不是最清晰的单词选择,但正如 Ned 提到的,他们试图指出,仅仅因为当时队列的大小t1是 7 并不意味着当你推送时它仍然是 7或稍后弹出值。

问题是,假设您从 qsize 返回的大小在您从该队列中推送/弹出一个值时仍然是正确的,这可能会在多线程环境中出现意外行为。

例如:

q = Queue()
if q.qsize > 0: # size is 1 here
    # another thread runs here and gets an item from your queue
    # this get fails and throws an exception in your thread:
    item = q.get(False)
    # do whatever processing with item you need to do

这是一个 LBYL“在你跳跃之前先看”的例子,它很危险,因为当多个线程正在访问队列时,这里可能会出现竞争条件。

在这种情况下,您应该支持 EAFP 或“更容易请求宽恕而不是许可”并执行以下操作:

from Queue import Queue, Empty
import time
q = Queue()
try:
    item = q.get(False)
    # do whatever processing with item you need to do 
except Empty:
    time.sleep(1)
于 2012-07-21T12:33:33.617 回答