队列

1,解耦,使程序实现松耦合(一个模块修改不会影响其他模块)
2,提高效率
队列中数据只有一份,取出来就没有了,区别于列表,列表数据取出来只是复制了一份,队列取出来相当于剪贴一份

FIFO(先入先出)

默认即为先入先出

  1. import queue
  2. # 先入先出(默认)
  3. q = queue.Queue()
  4. q.put(1)
  5. q.put(2)
  6. q.put(3)
  7. print(q.get())
  8. print(q.get())
  9. print(q.get())
  10. >>
  11. 1
  12. 2
  13. 3

LIFO(先入后出)

定义方法 queue.LifoQueue()

  1. q = queue.LifoQueue()
  2. q.put(1)
  3. q.put(2)
  4. q.put(3)
  5. print(q.get())
  6. print(q.get())
  7. print(q.get())
  8. >>
  9. 3
  10. 2
  11. 1

PriorityQueue(数据可设置优先级)

定义方法 queue.PriorityQueue()同优先级按照ASCII排序

  1. q = queue.PriorityQueue()
  2. # 本次写入元素为元组
  3. q.put((2,'2'))
  4. q.put((1,'1'))
  5. q.put((3,'3'))
  6. q.put((1,'a'))
  7. print(q.get())
  8. print(q.get())
  9. print(q.get())
  10. print(q.get())
  11. >>
  12. (1, '1')
  13. (1, 'a')
  14. (2, '2')
  15. (3, '3')

参数

  1. Queue参数maxsize是实例化 Queue 类时的一个参数,默认为 0即队列容量无限

假设把maxsize参数设置为3则当队列已经有3个元素再put元素则会陷入阻塞状态

  1. put参数

Queue.put(block=True, timeout=None) block用于设置是否阻塞,默认为True即阻塞,timeout用于设置阻塞等待时长即如果等待时长到了则退出阻塞抛出full错误

  1. import queue
  2. # block=False设置不阻塞,当队列满了再插入数据则抛出queue.Full错误
  3. q = queue.Queue(maxsize=3)
  4. q.put(1, block=False)
  5. q.put(2, block=False)
  6. q.put(3, block=False)
  7. q.put(4, block=False)

image.png

  1. Queue.get(block=True, timeout=None)

阻塞:当队列空了之后,get 就会阻塞,一直等待队列中有数据后再获取数据
不阻塞:当队列空了之后,如果设置 get 不阻塞,或者等待时长到了之后会报错:_queue.Empty

  1. import queue
  2. q = queue.Queue()
  3. q.put(1)
  4. print(q.get())
  5. print(q.get(block=False))

image.png

  1. Queue.empty()/Queue.full() 用于判断队列是否为空、满,尽量使用 qsize 代替