Python多线程:threading与GIL理解

Noah
Noah
发布时间:2026-09-11| 8人浏览过
原创

threading基础:创建、启动与管理线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。在Python中,threading模块提供了高级的线程接口。创建线程的核心类是threading.Thread,其关键参数包括target(指定线程要执行的函数)、args(以元组形式传递的位置参数)以及daemon(布尔值,决定主线程退出时是否强制终止该子线程)。启动线程必须调用start()方法,它会在底层向操作系统申请资源并安排执行;而join()方法用于阻塞当前主线程,直到目标线程执行完毕,常用于确保所有子任务完成后再继续后续逻辑。例如,通过循环实例化三个Thread对象并分别调用start()与join(),即可实现并发执行多个独立函数。注意,直接调用run()方法并不会开启新线程,仅相当于普通函数调用。

该节需要什么真实配图:真实Python代码编辑器或终端中运行threading多线程示例的截图
VS Code 中展示 threading.Thread 创建、启动线程并在终端运行的真实代码截图。

GIL到底是什么:为什么线程不等于并行

GIL(全局解释器锁)是CPython解释器内部的一个互斥锁,其设计初衷是为了保护Python对象的内存管理免受多线程并发访问的破坏。由于GIL的存在,同一时刻只能有一个线程执行Python字节码,这意味着在纯Python代码层面,多线程无法实现真正的CPU并行计算。然而,这并不意味着线程毫无用处。当线程执行阻塞型I/O操作(如网络请求、文件读写)或调用底层C扩展库时,GIL会被主动释放,此时其他线程可以获取GIL并继续执行。因此,对于I/O密集型任务,多线程能有效利用等待时间提升吞吐量;而对于纯Python编写的CPU密集型任务,GIL会导致线程频繁切换却无实质并行加速,甚至因上下文切换开销而变慢。理解GIL的释放时机,是合理选择并发模型的关键。

该节需要什么真实配图:CPython线程与GIL关系的真实技术演示或运行监控截图
GIL 示意图展示多个 Python 线程竞争全局解释器锁、同一时刻仅一个线程执行 Python 字节码。

动手验证:IO密集型与CPU密集型性能对比

为直观验证GIL的影响,可设计两组对照实验。第一组为CPU密集型:定义一个执行一千万次浮点运算的函数,分别使用单线程、threading创建4个线程以及multiprocessing创建4个进程运行,并使用time.perf_counter()记录耗时。实验结果通常显示,多线程耗时与单线程相近甚至更长,而多进程耗时显著缩短,印证了GIL对CPU计算的串行限制。第二组为I/O密集型:模拟网络请求,使用time.sleep(1)代替实际请求,同样对比单线程、多线程与多进程。此时多线程总耗时接近1秒(并发等待),远优于单线程的4秒,多进程虽也能并发但进程创建开销更大。实验中需严格控制任务数量、硬件核心数及计时起点终点,确保变量唯一。该对比清晰表明:I/O任务选多线程,CPU任务选多进程。

该节需要什么真实配图:Python性能测试终端输出、耗时对比或系统CPU监控截图
实际 Python 多线程性能基准图,对比不同 worker 数量下 threading 与 multiprocessing 的耗时变化。

线程安全与常见坑:共享数据、锁和正确选型

多线程共享可变数据时极易引发竞态条件。例如多个线程同时对全局计数器执行counter += 1,由于该操作非原子性(包含读取、计算、写入三步),最终结果往往小于预期。解决此问题需引入同步机制,最基础的是threading.Lock。通过with lock:上下文管理器包裹临界区代码,可确保同一时刻仅一个线程访问共享资源。但滥用锁会导致性能骤降,甚至因嵌套加锁顺序不当引发死锁。此外,盲目为每个任务创建线程会耗尽系统资源,应使用线程池控制并发上限。选型原则需牢记:I/O密集型且需简单并发时优先threading;纯CPU计算或需完全并行时选用multiprocessing;高并发网络服务且逻辑复杂时,推荐asyncio配合协程,以单线程事件循环实现极高吞吐。

该节需要什么真实配图:真实Python代码中Lock保护共享计数器或线程安全示例的截图
真实 Python 线程安全代码截图,用 threading.Lock 保护共享计数器并避免竞态条件。
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。