Python queue模块源码分析(第一篇:queue模块介绍)
2022/1/12 1:04:52
本文主要是介绍Python queue模块源码分析(第一篇:queue模块介绍),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
通过queue模块中的对象,我们可以创建线程安全的普通队列,优先级队列、堆栈。它们不仅可以用于线程间交换数据(线程间通信),还支持线程间阻塞(线程间同步),我常常喜欢称它们为【线程间通信+同步】的数据结构!今天通过源码学习作者是如何实现的线程间同步,又是如何实现的线程间通信!
queue模块介绍
queue模块源码位于Pythonxx/Lib/queue.py文件中,xx取决于你的版本(本文基于Python3.7),属于标准库中的一员,下面是queue模块中的属性情况
全局变量:1个
类:6个
导入queue模块
import queue
第一次import queue的时候,queue模块中没有缩进的代码会执行,所以我会首先分析queue模块的代码的执行情况
queue模块代码分析
一、导入依赖(持有)的模块对象
1、线程模块对象的导入
import threading
2、双端队列类对象的导入
from collections import deque
3、堆排序算法的导入
from heapq import heappush, heappop
4、时间的导入(单调时钟)
from time import monotonic as time
5、SimpleQueue的导入,如果支持的话,不支持就赋值SimpleQueue为None
try: from _queue import SimpleQueue except ImportError: SimpleQueue = None
6、限制from queue import *时的导出的属性,用到的是模块的内置属性__all__,这里是覆盖了该值
__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue', 'SimpleQueue']
7、尝试从_queue模块中导入Empty类对象,如果没有导入成功,就自己创建Empty类,Empty类继承于Exception,它产生的对象,表示某个容器中没有元素
try: from _queue import Empty except AttributeError: class Empty(Exception): 'Exception raised by Queue.get(block=0)/get_nowait().' pass
二、创建Full类
Full类产生的对象,表示队列已经满了,不能再添加元素
class Full(Exception): 'Exception raised by Queue.put(block=0)/put_nowait().' pass
三、创建Queue类
它产生的对象,表示线程安全的普通队列,且支持阻塞线程
class Queue: …………省略很多代码…………
四、创建PriorityQueue类
它产生的对象,表示线程安全的优先级队列,同样支持阻塞线程
class PriorityQueue(Queue): …………省略很多代码…………
五、创建_PySimpleQueue类
该类用于表示SimpleQueue,后面具体的分析的时候会看到
class _PySimpleQueue: …………省略很多代码…………
六、检查模块的属性SimpleQueue
if SimpleQueue is None: SimpleQueue = _PySimpleQueue
当SimpleQueue属性指向None的时候(从_queue导入失败),会将_PysimpleQueue这个类对象赋值给它,此时SimpleQueue指向_PySimpleQueue这个类对象
总结
1、稍后的文章将分析Queue对象的创建、Queue的添加元素、删除元素、所有的API方法,看看它是如何实现的线程安全、又是如何实现的线程间同步
2、当然还有其他所有的实现类
参考文章:queue --- 一个同步的队列类 — Python 3.10.1 文档
这篇关于Python queue模块源码分析(第一篇:queue模块介绍)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25Python编程基础:变量与类型
- 2024-11-25Python编程基础与实践
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器