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

Her*_*arn 1 python queue multithreading

队列的大小可以通过使用 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())
    
    Run Code Online (Sandbox Code Playgroud)

输出如下:

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

Cly*_*ost 5

查看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
Run Code Online (Sandbox Code Playgroud)


Pet*_*ang 5

回答您的第一个问题:就所有意图和目的而言,队列的最大大小是无限的。原因是,如果您尝试将某些东西放入已满的队列中,它将等待直到某个插槽打开后才将下一项放入队列中。假设您使用最大大小参数初始化队列。您可以在此处看到:class queue.Queue(maxsize)您可以传递maxsize参数。根据文档:“如果maxsize小于或等于零,则队列大小为无限。”

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

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

如果超时为正数,则在最多超时秒内阻塞,并在该时间内没有可用插槽时引发Full异常。否则(块为false),如果有空闲插槽立即可用,则将项目放在队列中,否则引发Full异常(在这种情况下,超时将被忽略)。

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

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