- Python高并发与高性能编程:原理与实践
- 周宇凡
- 980字
- 2023-08-28 20:06:29
2.2 线程优先级队列的改进
根据CPython官方的设计理念,Python中并不存在队列这种概念。队列这种概念只是众多Python开发者提出的。在Python中,我们可以把队列简单地理解为一个列表,这个列表中可能会存放相同类型或不同类型的数据或Python对象。结合队列的概念,这个列表中每一个元素都是队列需要执行的任务,列表的总大小就是队列需要执行的任务总数量。当我们将队列中的元素全部修改为Python线程对象时,队列可以称为Python线程队列。当需要使用Python中的额外线程时,我们只需要从Python线程队列中取一个Python线程对象即可。
每一个线程对象,不管是Java线程对象还是Python线程对象,都具备优先级这一特性。线程的优先级被封装在线程对象中,以线程对象中一个属性的形式存在。当我们初始化一个Python线程之后,其线程对象就已经具备线程优先级的属性,只不过这个线程对象的优先级属性的值是通过Python虚拟机进行设置的。Python线程对象的优先级属性默认是不开启的,当我们需要用到时可手动设置开启。当我们把多个开启优先级属性的Python线程对象放入一个队列,该队列就可以被称为线程优先级队列了。
在Python 2.7.18中,定义一个线程优先级队列的方式如下所示。
在Python 3.9.13中,定义一个线程优先级队列的方式如下所示。
通过对比可以看出,无论Python 2版本还是Python 3版本,创建线程优先级队列的方式本质上还是没有很大差别,都需要先引入相应的库,之后从库中获取线程优先级队列。在Python 2中,线程优先级队列位于Queue库,以PriorityQueue类的形式存在;在Python3中,线程优先级队列位于queue库,以PriorityQueue类的形式存在。线程优先级队列所在的库是一样的,只是在Python 2中,Queue的首字母大写了,而在Python 3中全是小写。无论在Python 2还是Python 3中,线程优先级队列会始终遵循优先级数字越小,执行优先级越高的原则。在上述代码片段中,pQueue都是线程优先级队列,笔者使用put方法将元组中的元素放入线程优先级队列,其中,传入元组中元素的第一个参数表示优先级大小,第二个元素表示传入线程优先级队列的真实元素。传入的优先级数字越小,则pQueue就会优先执行该元素。
从微观上来说,Python 3版本中的线程优先级队列较Python 2版本中的线程优先级队列都有哪些改进呢?笔者对Python 2和Python 3(这里以Python 3.9.13版本为例)中PriorityQueue类的组成结构绘制了思维导图,分别如图2-5和图2-6所示。
图2-5 Python 2中PriorityQueue类的组成结构
通过对比图2-5、图2-6可以发现,Python 3版本中的PriorityQueue类比Python 2版本中的PriorityQueue类多了3个内置方法,并没有在线程优先级队列的底层实现上做出性能改进和优化。
图2-6 Python 3.9.13中PriorityQueue类的组成结构