#首先要知道,python的列表是不安全的,
#因为它不符合原子性,对列表中的某个元素进行操作有两部,先取到元素,然后改变值
# queue模块
# 首先说一下queue模块
# 这个模块其实就是实现了一个叫队列的数据结构,但是它是线程安全的
# 而且严格来说不只是队列,还能实现栈.
import queue
# 先进先出,也就是传统意义上的队列,也就是滑滑梯
q = queue.Queue(2) # 在构造的时候可以给定队列的最大容量,不给的话默认是没有上限
"""
如果队列当前已满且 block 为 True,put() 方法就使调用线程暂停,直到空出一个数据单元。
如果block为 False,put 方法将引发 Full 异常
"""
q.put(1)
q.put(2)
"""
调用队列对象的 get() 方法从队头删除并返回一个项目。可选参数为 block,默认为 True。
如果队列满了且 block 为 True,get() 就使调用线程暂停,直至有项目可用。
如果队列满了且 block 为 False,队列将引发 Empty 异常。
常用的方法是先判断一个队列是否为空,如果不为空则取值。"""
print(q.get())
print(q.qsize()) # 注意,在取出一个元素后,队列显示为只剩下一个元素了
# 后进先出队列,也就是填弹夹
q1 = queue.LifoQueue()
q1.put(1)
q1.put(2)
print(q1.get())
#full()和empty()判断队列是否已满/空了
# 优先级队列
# 当优先级相同时,按放数据顺序取数据
q2 = queue.PriorityQueue()
q2.put((1, "本元素优先级为1"))
q2.put((2, "本元素优先级为2"))
print(q2.get()) # (1, '本元素优先级为1')