Python队列的三种队列实现方法
今天讲一下队列,用到一个python自带的库,queue
队列的三种实现方法有:
1、FIFO先入先出队列(Queue)
2、LIFO后入先出队列(LifoQueue)
3、优先级队列(PriorityQueue)
先讲一下Queue中的几个方法
# 三种 FIFO LIFO Priority # 创建先入先出的队列 # q = queue.Queue() # q.qsize() # 返回当前队列包含的消息数量 # q.empty() # 如果队列为空返回True 反之False # q.full() # 如果队列满了,返回True 反之False # q.get() # 获取队列,timeout等待时间 get(self, block=True,timeout=None) block表示是否等待 timeout表示等待多久 # q.put(item) # 写入队列 put(self, item, block=True,timeout=None) block表示是否等待 timeout表示等待多久 # q.get_nowait() # 相当于q.get(False) 获取不等待 # q.put_nowait() # 相当于 q.put(item,False) 写入不等待 # q.task_done() # 在完成一项工作之后,使用这个方法可以向队列发送一个信号,表示该任务执行完毕 # q.join() # 等待队列中所有任务(数据)执行完毕之后再往下执行,否则一直等待 # 注意点 :join是判断的依据。不单单指的是队列中没有数据,数据get出去之后,要使用task_done向队列发送一个信号,表示该任务执行完毕 # /数据使用完毕
在下面我们用代码来解释
Queue:先入先出队列
import queue
q1 = queue.Queue(3) # 定义3 指定队列长度 表示只能塞3条数据 不写可以无限塞 q1.put(1) # 等待插入 q1.put(11) q1.put(33) # q1.put(33,block=False) # 不等待插入 满了之后报错 # q1.put_nowait(33) # 不等待插入 满了之后报错 print(q1.get()) print(q1.get()) # 先入先出获取 1先出 33最后出 print(q1.get()) # print(q1.get(block=False)) # 不等待获取 队列为空报错 # print(q1.get_nowait()) # 不等待获取 队列为空报错 # q1.put(3) print(q1.qsize()) # 获取队列中的任务数/消息数 print(q1.full()) # 判断队列是否已满 print(q1.empty()) # 判断队列是否为空 q1.task_done() q1.task_done() q1.task_done() # 插入一条数据使用完成之后就要发送一条消息 q1.join() # 收到task_done返回的信号,当都使用完成之后才会继续往下执行 如果任务没有完成那将不会向下执行 print(\'join之后\')
LifoQueue:后入先出队列
import queue
q = queue.LifoQueue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get()) # 后进先出 其他方法与FIFO相同
PriorityQueue:优先级队列
import queue q = queue.PriorityQueue(3) # 其他方法与 FIFO 相同 q.put((1, \'哈哈1\')) # 接受元组为参数 第一个是优先级数字型的 第二个是数据 q.put((88, \'哈哈88\')) q.put((3, \'哈哈3\')) print(q.get()) print(q.get()) print(q.get()) # 根据前面的优先级出,优先级数字小的先出
利用队列可以解决多线程对共享全局变量的一个处理