python 模块之queue模块,将数据结构中栈(先进后出)和队列(先进先出)这种数据结构的封装,把抽象的数据结构封装成类的属性和方法
注意:队列都是在内存中操作,进程退出,队列清空,并且队列是一个阻塞的形态
队列模块涉及的操作:
1、入队 (把数据添加到队列末尾)
2、出队 (从队列首部取出元素)
3、队列初始化 (创建队列)
4、销毁队列 (把整个队列的数据从内存中删除),Python中有自动销毁机制,无需手动处理
5、判断队列是否为空
6、判断队列是否满
7、获取队列的长度
队列分类:
队列形式 队列特点
queue.Queue 先进先出
queue.LifoQueue 后进先出队列
queue.PriorityQueue 优先级队列
queue.deque 双线队列
队列的方法:
put 放数据。有block = true 和timeout这2个参数
当block为true时,写入是阻塞的,阻塞时间由timeout决定,当队列被其他线程写满,这段代码就会阻塞,直到其他线程 取走数据。用block=false可以解决,但是非阻塞方式写入队列,当队列满时会抛出异常exception Queue.Full
get 取数据,queue.get()获取队列,timeout等待时间
empty 如果队列为空,则返回true
qsize 显示队列中还真实存在的元素长度
maxsize 最大支持的队列长度,使用时无括号
join 实际上是意味着等到队列为空再执行别的操作
task_done 在完成一项工作后,该函数向任务已经完成的队列发送一个信号
full 如果队列满了就返回true
task_done() :意味着之前入队的一个任务已经完成。
join() 表示我们所有的任务都完成了才会不被阻塞
举例说明:
q = queue.Queue(3)
q.put(9,block=True,timeout=5)
q.put_nowait(16)
q.task_done()
print(q.get())
q.join()
#此时程序运行会一直阻塞
q = queue.Queue(3)
q.put(9,block=True,timeout=5)
q.task_done()
q.put_nowait(16)
q.task_done()
print(q.get())
q.join()
#优化方法
#单向队列
import queue
q = queue.Queue(5) #这里指定了长度为5,不设置长度默认为无限长
print(q.maxsize)
q.put('123')
q.put('45')
q.put('23')
q.put('234')
q.put('34556')
#q.put('12345')
print(q.get()) #队列长度为5,当放入了6个元素,就会造成队列阻塞
import queue
#先进后出队列
q = queue.LifoQueue()
q.put(123)
q.put(1234)
print(q.get())
#取得值是 1234
import queue
#优先级队列
#优先级队列 :优先级队列是put一个元祖(优先级、数据),优先级数字越小,优先级程度越高
q = queue.PriorityQueue()
q.put((10,'34'))
q.put((3,'5'))
q.put((20,'34'))
print(q.get()) #-->(3, '5')
import queue
#双线队列
q = queue.deque()
q.append(123)
q.append(345)
q.appendleft(678)
#
print(q.pop()) #-->345
print(q.popleft()) #-->678
根据队列的种类,我们稍微总结下:
队列是在一端入栈,一端出栈 (单向,先进先出)
栈是同一端进入和出去 (先进后出)
双向队列则是两端都可以进同时也可以出
优先级是可以根据设定的优先级进行出和入