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

Fro*_*Zzz 12 python multithreading

在qsize()的文档中,它说:返回队列的大致大小.

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

Ned*_*der 30

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

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


std*_*err 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
Run Code Online (Sandbox Code Playgroud)

这是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)
Run Code Online (Sandbox Code Playgroud)

  • 队列已经同步,不要在顶部添加更多.使用带有异常的`q.get`是获得项目的最佳线程安全方法. (6认同)