在qsize() 的文档中它说:返回队列的近似大小。
为什么它不能只返回这个队列的确切大小?我知道队列可能被多个线程访问,但是在我调用该函数的那一刻,我认为仍然可以返回那个时刻的确切大小。
在qsize() 的文档中它说:返回队列的近似大小。
为什么它不能只返回这个队列的确切大小?我知道队列可能被多个线程访问,但是在我调用该函数的那一刻,我认为仍然可以返回那个时刻的确切大小。
正是因为有其他线程在访问它。当您尝试使用从 qsize() 返回的大小时,队列可能已经改变。如果文档阅读如下内容会更好:
返回队列的大小。请注意,在多线程环境中,大小可以随时更改,这只是实际大小的近似值。
我同意“近似”不是最清晰的单词选择,但正如 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)