Python--队列

Python中有队列的库---queue,自带的,不需要我们另外下载,直接导入用即可

学习队列我们可以直接从官方的文档中直接学习,这里贴一下:https://docs.python.org/zh-cn/3.7/library/queue.html#simplequeue-objects  这是中文的文档

还可以通过源码直接学习,看自己怎么习惯怎么来吧

首先通过官方文档我们可以知道Python中的队列的简介:

queue 模块实现多生产者,多消费者队列。当信息必须安全的在多线程之间交换时,它在线程编程中是特别有用的。此模块中的 Queue 类实现了所有锁定需求的语义。它依赖于Python支持的线程可用性

从这里我们可以明白队列是适用于生产者,消费者,同时队列实现了所有锁的需求语义,这句话什么意思呢?告诉我们如果使用多线程和队列的同时,就完全不用考虑锁的问题了。

其次我们可以从官方文档中知道队列有三种,先入先出队列,先入后出队列,优先级队列

解释下这三种队列的区别:

先入先出:从字面意思可以理解先进入队列的会先被拿出来,也就是先进入队列的任务会先被拿出来执行

先入后出:从字面意思可以理解为先进入队列的会在最后被拿出来,也就是先进入队列的任务会在最后被拿出来执行

优先级队列:每一个进入队列的任务会有一个优先级标签,在把任务取出来的时候会按照这个优先级作为考量,将其取出,会按照优先级越低先取出来执行

下面介绍下队列中最重要的了,建议直接从源码中进行学习

1、创建队列

创建一个先入先出的队列

q = queue.Queue()

查看源码我们知道Queue类中有一个maxsize参数,默认为0,我们可以不传,也就是默认为0了,但同时底层实现了如果为0的话就表示这个队列无限大。所以如果你要限制队列的大小,那就必须得传一个数字了,而且必须大于0,因为小于等于0都会表示是一个无限大的队列

 

 

 创建一个先入后出的队列

q = queue.LifoQueue()

创建一个优先级队列

q = queue.PriorityQueue()

值得注意的是,PriorityQueue和LifoQueue都是继承于Queue的,所以里面的方法的用法没有区别

2、添加任务到队列,使用put方法

用法:

q = queue.Queue(2)   # 创建一个队列,容量为2
q.put(1)   # 正常插入
q.put(2)   # 正常插入
q.put(3)   # 会引发异常,一直阻塞,直到队列有空闲位置

同时put_nowait方法也是添加任务到队列,与put方法的区别为:put方法如果满了不会直接报错,会一直阻塞,而put_nowait会直接报错

3、获取队列中的任务,使用get方法

用法

q = queue.Queue(2)   
q.put(1)   
print(q.get())  

同时,get_nowait方法也会从队列中取值,与get方法的区别在于:如果队列为空,使用get则会阻塞,使用get_nowait则会直接报错

4、获取队列中的任务数量,使用qsize方法

用法

q = queue.Queue()   # 创建一个队列
q.put(1)   
q.put(2)  
print(q.qsize())  # 获取队列的大小

5、获取队列是否已经满了,使用full方法

用法

q = queue.Queue(2)   # 创建一个队列
q.put(1)
q.put(2)
print(q.full())  # 获取队列是否已经被装满,满了则返回True,没有满则返回False

6、获取队列是否为空,使用empty方法

用法

q = queue.Queue(2)   # 创建一个队列
q.put(1)
q.put(2)
print(q.empty())  # 获取队列是否为空,为空则返回True,不为空则返回False

7、队列任务被执行完成,使用task_done方法

用法

q = queue.Queue(2)   # 创建一个队列
q.put(1)
q.get() q.task_done()

所以我们在调用get方法后就要调用task_done方法告诉队列这个任务已经被完成了,已经空闲了一个队列位置了,但是注意的是,如果调用的次数多余队列中的任务数则会引发ValueError异常

8、队列中任务执行完毕后执行后续的逻辑,使用join方法

用法

q = queue.Queue(2)   # 创建一个队列
q.put(1)
q.task_done()
q.join()
print("cccc")

以上介绍的就是队列中的常用方法,get了吗?

 

posted @ 2021-05-17 17:18  大渝  阅读(570)  评论(0编辑  收藏  举报