Python_队列

queue

queue.Queue模块实现了FIFO(先进先出)、LIFO(后进先出)、优先级队列(Priority Queue)三种类型的队列,是多生产者、消费者队列。

FIFO(Queue)

  • empty()
  • full()
  • put(item,block=False,timeout=None)
  • get(item)
  • put_nowait()
  • get_nowait()
  • task_done()
  • join()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -*- coding:utf-8 -*-
from queue import Queue, LifoQueue, PriorityQueue, SimpleQueue

# FIFO队列 maxsize=0或者不设置maxsize(init会初始化等于0) 队列将无穷大
fifo_queue = Queue(maxsize=3)
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))

# 生产者生产
fifo_queue.put(1)
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))
fifo_queue.put(2)
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))
fifo_queue.put(3)
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))

fifo_queue.put(4) # 队列满了将会一直阻塞,直到fifo_queue有其他消费者消费项目
fifo_queue.put(4, block=True, timeout=1) # 队列满了将会阻塞,block+timeout(s) 配合控制阻塞时间,若到达阻塞超时时间依旧没有任何项目被消费,则抛异常queue.Full
# 相当于put(item, block=False),队列满了,直接抛异常
fifo_queue.put_nowait(4)


# 消费者消费
print(fifo_queue.get())
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))
print(fifo_queue.get())
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))
print(fifo_queue.get())
print("当前队列长度:%d; 队列是否为空:%s; 队列是否满额:%s;" % (fifo_queue.qsize(), fifo_queue.empty(),fifo_queue.full()))

# 无项目可以被消费 等待生产者生产项目进来后,再进行消费;若无项目进入,将会一直阻塞
fifo_queue.get()
# 无项目可以被消费 等待生产者生产项目进来后,再进行消费;若无项目进入,block+timeout(s) 配合控制阻塞时间,若到达阻塞超时时间依旧没有任何项目被生产加入,则抛异常queue.Empty
fifo_queue.get(block=True,timeout=1)
# get(item, block=False),队列空了,直接抛异常
fifo_queue.get_nowait(4)

LIFO(LifoQueue)

PriorityQueue

SimpleQueue