队列
队列
队列类似于一条管道,元素先进先出,进put(arg),取get()
有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态.
队列分类
队列有很多中,但都依赖模块queue
队列方式 特点
queue.Queue 先进先出队列
queue.LifoQueue 后进先出队列
queue.PriorityQueue 优先级队列
queue.deque 双线队列
队列的方法
方法 用法说明
put 放数据,Queue.put()默认有block=True和timeout两个参数。当block=True时,写入是阻塞式的,阻塞时间由timeout确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常
get 取数据(默认阻塞),Queue.get([block[, timeout]])获取队列,timeout等待时间
empty 如果队列为空,返回True,反之False
qsize 显示队列中真实存在的元素长度
maxsize 最大支持的队列长度,使用时无括号
join 实际上意味着等到队列为空,再执行别的操作
task_done 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
full 如果队列满了,返回True,反之False
示例一
# 导入队列
from queue import Queue
# 最多接收3个数据
q = Queue(3)
# put 向队列中添加数据
q.put(1)
q.put(2)
q.put(3)
# 获取当前队列长度
print(q.qsize())
# 取出最前面的一个数据 1 , 还剩两个
print(q.get())
# 再加入数据
q.put(4)
#超过三个了.如果没有timeout参数会处于阻塞状态,卡在那边.若设置2秒,2秒后会raise 一个 FULL的报错
q.put(5, timeout=2))
# 当然,也可以直接给个 block=False,强制设置为不阻塞(默认为会阻塞的),一旦超出队列长度,立即抛出异常
q.put(6, block=False)
# 同样的,当取值(get)的次数大于队列的长度的时候就会产生阻塞,设置超时时间意为最多等待x秒,队列中再没有数据,就抛出异常.
也可以使用block参数,跟上面一样
示例二:join & task_done
empty: 检查队列是否为空,为空返回True,不为空返回False
full : 判断队列是否已经满了
join & task_done :
#举例
from queue import Queue
q = queue.Queue(2)
q.put('a')
q.put('b')
# 程序会一直卡在下面这一行,只要队列中还有值,程序就不会退出
q.join()
-------------------------------------------------------------
q = queue.Queue(2)
q.put('a')
q.put('b')
q.get()
q.get()
# 插入两个元素之后再取出两个元素,执行后发现,程序还是卡在下面的那个join代码
q.join()
-------------------------------------------------------------
q = queue.Queue(2)
q.put('a')
q.put('b')
q.get()
# get取完队列中的一个值后,使用task_done方法告诉队列,我已经取出了一个值并处理完毕,下同
q.task_done()
q.get()
#在每次get取值之后,还需要在跟队列声明一下,我已经取出了数据并处理完毕,这样执行到join代码的时候才不会被卡住
q.task_done()
q.join()
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华