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

时间:2016-07-27 13:47:20

标签: python multithreading queue

使用qsize()

可以了解队列的大小
  • 我们如何知道队列的最大大小?或者以其他方式,当条件queue.full()将返回True
  • 为什么q.put(i)的结果总是导致None,而q.get(i)导致相应的值?

    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 个答案:

答案 0 :(得分:3)

查看Queue实施的源代码: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

答案 1 :(得分:3)

回答你的第一个问题:出于所有意图和目的,队列的最大尺寸是无限的。原因在于,如果您尝试将某些内容放入已满的队列中,它将等待一个插槽打开,然后将下一个项目放入队列中。这假设您使用max size参数初始化Queue。您可以在此处看到:class queue.Queue(maxsize)您可以传递maxsize参数。根据{{​​3}}:“如果maxsize小于或等于零,则队列大小是无限的。”

这导致了第二个问题:put()方法将项​​放入队列,如果成功则返回None。从文档中,

  

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

     

如果超时是一个正数,它会阻止最多超时秒,如果在该时间内没有空闲时隙,则会引发完全异常。否则(块为假),如果空闲插槽立即可用,则将项目放在队列中,否则引发完全异常(在这种情况下忽略超时)。

因此,当您将某些内容放入队列时,除非引发异常,否则它将始终返回None。另一方面,get()返回它获得的项目。再次来自文档:

  

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