使用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)
答案 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]])
:从队列中删除并返回一个项目。