Python:如何知道队列的最大大小

5

通过使用 qsize() 可以知道队列的大小

  • How do we know the max size of a queue? Or in other way, when the condition queue.full() will return True?
  • Why is the result for q.put(i) always resulting in None whereas q.get(i) is resulting in corresponding value?

    from queue import Queue
    q = Queue()
    
    print("------Queue info when putting -----")
    
    for i in range(5):
       print("---Loop---- :",i) 
       print("queue empty : ", q.empty())
       print("put : ",q.put(i))
       print("queue size : ", q.qsize())
       print("queue full : ", q.full())
    
    print("------Queue info when getting -----")        
    
    for i in range(5): 
       print("---Loop---- :",i)
       print("get : ",q.get(i))
       print("task done : ",q.task_done())
       print("queue empty : ", q.empty())
    
输出结果如下:
------Queue info when putting -----     
---Loop---- : 0    
queue empty :  True    
put :  None    
queue size :  1    
queue full :  False    
(loop continues for 5 times)


------Queue info when getting -----
---Loop---- : 0    
get :  0    
task done :  None    
queue empty :  False     
(loop continues for 5 times)
2个回答

10
为了回答您的第一个问题:就所有实际操作而言,队列的最大大小是无限的。原因是,如果你试图把一些东西放到一个已经满了的队列里面,它将等待直到有一个空位才会把下一个物品放进队列中。这是假设你用最大尺寸参数去初始化队列的情况。你可以在这里看到:class queue.Queue(maxsize),你可以传递一个maxsize参数。根据文档:“如果maxsize小于或等于零,则队列大小为无限。”
这带来了第二个问题:put()方法会将项目放入队列,并在成功时返回None。从文档中可以看出:

put(item[, block[, timeout]])

如果timeout是正数,则在最多timeout秒内阻塞,并在该时间内没有可用的空闲插槽时引发Full异常。否则(block为false),如果立即有可用的空闲插槽,则将项目放到队列中,否则引发Full异常(在这种情况下不考虑timeout)。

因此,当你把某些东西放进队列时,除非出现异常,它总是会返回None。另一方面,get()方法会返回它获取到的项目。再从文档中看:

get([block[, timeout]]): 从队列中删除并返回一个项。


原因是如果您尝试将某些东西放入已满的队列中,它将等待直到有一个插槽打开才将下一个项目放入队列。那么put(item,False)或等效的put_nowait(item)怎么办? 它不会等待该项被消耗,而只会引发“Full”。 因此,总体而言,它并不是无限的。 - Adrian

6

请查看队列实现的源代码:https://hg.python.org/cpython/file/3.5/Lib/queue.py

从init函数中可以看出,'queue.maxsize'是一个成员变量,应该包含队列的最大大小。

因此,您可以像这样做:

from queue import Queue

my_queue = Queue(maxsize=10)
max_size = queue.maxsize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接