在qsize()的doc中,它说:返回队列的大致大小。
为什么它不能只返回此队列的确切大小?我知道Queue可能被多个线程访问,但是现在我调用了该函数,我认为它仍然可以返回那个时刻的确切大小。
答案 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)