为什么Python的队列在qsize()中返回一个近似大小?

时间:2012-07-21 11:54:38

标签: python multithreading

在qsize()的doc中,它说:返回队列的大致大小。

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

2 个答案:

答案 0 :(得分:28)

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

  

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

答案 1 :(得分: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)