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

根据队列的种类,我们稍微总结下:

队列是在一端入栈,一端出栈  (单向,先进先出)

栈是同一端进入和出去     (先进后出)

双向队列则是两端都可以进同时也可以出

优先级是可以根据设定的优先级进行出和入