news 2026/7/22 15:20:18

PythonGIL

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PythonGIL

GIL 是什么?—— 背景与设计初衷

🔹 定义

GIL(Global Interpreter Lock)是 CPython 解释器(即官方 Python 实现)中的一个全局互斥锁(mutex),它确保同一时刻只有一个线程在执行 Python 字节码

注意:GIL 是CPython 特有,不是 Python 语言标准。
其他实现如 PyPy、Jython、IronPython没有 GIL

🔹 为什么需要 GIL?

在 1990 年代,Python 设计者面临两个选择:

  1. 为每个对象加细粒度锁(复杂、开销大)
  2. 加一个全局锁(简单、高效)

由于当时多核 CPU 尚未普及,且 CPython 内存管理(引用计数)不是线程安全的,若多个线程同时修改对象的引用计数(如ob_refcnt),会导致内存崩溃。

GIL 的核心目的

简化 CPython 的内存管理,避免多线程并发修改对象头导致解释器崩溃。

📌 关键点:GIL 保护的是解释器内部状态,不是你的业务数据!
即使有 GIL,你的多线程程序仍需自己加锁(如threading.Lock())来保证业务逻辑正确。

GIL 如何工作?—— 线程争抢与释放机制

GIL 释放时机(CPython 3.2+)

CPython 使用“协作式 + 抢占式”混合策略

情况是否释放 GIL
I/O 操作(如time.sleep(),file.read(),socket.recv()✅ 立即释放(让其他线程运行)
执行 N 条字节码后(默认 5ms,可调)✅ 主动释放,触发线程切换
C 扩展显式释放(如 NumPy、regex)✅ 在耗时 C 代码中释放 GIL
纯 Python 计算循环❌ 不释放(直到时间片用完)

Python 3.2 引入了“GIL 改进算法”(由 Antoine Pitrou 设计),避免线程“饥饿”:

  • 线程在请求 GIL 时会进入等待队列;
  • 当前线程释放 GIL 后,唤醒等待队列中的第一个线程
  • 防止某个线程反复抢到 GIL(旧版问题)。

GIL 对性能的影响

场景影响说明
CPU 密集型任务(如数学计算、图像处理)❌ 严重退化多线程无法并行,速度 ≈ 单线程
I/O 密集型任务(如 Web 请求、文件读写)✅ 几乎无影响线程在 I/O 时释放 GIL,其他线程可运行
混合任务⚠️ 部分受限I/O 部分可并发,计算部分串行

示例:4 核 CPU 上运行纯计算任务

  • 单线程:100% 利用 1 核
  • 4 线程:仍只用 1 核,总耗时几乎不变(甚至更慢,因线程切换开销)

如何绕过 GIL?—— 解决方案

方案原理适用场景工具/库
多进程(Multiprocessing)每个进程有独立 Python 解释器 + GILCPU 密集型multiprocessing,concurrent.futures.ProcessPoolExecutor
使用 C 扩展释放 GIL在 C 代码中手动释放 GIL数值计算、编解码NumPy, Pandas, OpenCV, Cython(with nogil
换用无 GIL 的 Python 实现底层无 GIL 限制特定项目PyPy(部分场景)、Jython(JVM 上)
异步 I/O(asyncio)单线程事件循环,避免线程切换I/O 密集型高并发FastAPI, aiohttp, asyncpg
将计算卸载到外部服务用 Rust/C++/Go 写微服务极致性能gRPC 调用、消息队列分发

最佳实践

  • I/O 密集 → 用asyncio或多线程
  • CPU 密集 → 用多进程或 C 扩展

GIL 争抢流程图(可视化)

文字描述流程

CPU-Bound TaskI/O OperationThread CThread BThread AGIL-LockCPU-Bound TaskI/O OperationThread CThread BThread AGIL-Lock启动三个线程 A: I/O密集, B/C: CPU密集持有 GIL 不释放(直到 ~5ms 时间片到期)同样持有 GIL ~5ms关键规则:- I/O 立即释放 GIL- CPU 任务每 ~5ms 释放一次- 等待线程按 FIFO 唤醒请求 GIL授予 GIL执行 I/O 操作 如 socket.recv()阻塞等待主动释放 GIL(因 I/O)唤醒等待队列头(Thread B)获取 GIL授予 GIL执行 CPU 密集任务(纯 Python 循环)时间片用完主动释放 GIL唤醒 Thread C获取 GIL授予 GIL执行 CPU 密集任务时间片用完释放 GILThread A 已完成 I/O,重新入队并被唤醒重新获取 GIL授予 GIL继续执行后续逻辑

六、常见误区澄清

误区正确理解
“GIL 保证我的数据线程安全”❌ GIL 不保护业务数据!仍需Lock
“多线程在 Python 中完全没用”❌ I/O 密集型场景多线程非常高效
“GIL 会在 Python 未来版本移除”❌ CPython 核心开发者多次表示:短期内不会移除(破坏兼容性太大)
“asyncio 能绕过 GIL”⚠️ asyncio 是单线程,不涉及 GIL 争抢,但也不能并行计算
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 19:55:13

TinyMCE5实现ppt动画效果转html兼容处理

作为一名苦逼的大三软件工程狗,我来分享下Word转存功能的血泪史 各位老铁们好啊!我是一名来自重庆某高校的软件工程大三学生,最近在折腾一个CMS新闻管理系统的升级,特别是那个让人头秃的Word内容粘贴功能。下面我就来分享下我的探…

作者头像 李华
网站建设 2026/7/19 12:57:13

2025 最新!10个AI论文平台测评:本科生写论文必备攻略

2025 最新!10个AI论文平台测评:本科生写论文必备攻略 2025年AI论文平台测评:为什么你需要这份指南? 随着人工智能技术的不断进步,越来越多的本科生开始借助AI工具辅助论文写作。然而,面对市场上琳琅满目的平…

作者头像 李华
网站建设 2026/7/19 18:58:29

MySQL 版本安装教程

本教程是 MySQL 的安装教程,这里选择的是 MySQL 9.0 版本的安装包,手把手教你安装 MySQL。 打开浏览器,在地址栏输入 https://www.mysql.com ,回车访问 MySQL 官网。 官网目前提供的是 MySQL 9.5、MySQL 8.0.44、MySQL 8.4.7 LT…

作者头像 李华
网站建设 2026/7/19 19:08:15

收藏!网络安全工程师成长路线图,从零基础到百万年薪

网络空间安全建设刻不容缓,已成为国家安全建设的重中之重。 随着境内外敌对势力的大规模安全事件,《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全产业从小众产业逐步发展成为国家…

作者头像 李华
网站建设 2026/7/20 12:36:08

猎庄敢死队 通达信经典指标 源码

{}B1:(HHV(H,9)-C)/(HHV(H,9)-LLV(LOW,9))*100- 70; B2:SMA(B1,9,1)100; B3:(C-LLV(L,9))/(HHV(H,9)- LLV(L,9))*100; B4:SMA(B3,3,1); B5:SMA(B4,3,1)100; B6:B5-B2;{分析家} B7:IF(B6>60,B6-60,0); 持有:STICKLINE(REF(B7,1)<B7,B7,REF(B7,1),5,0),COLORRED; A:0,POINT…

作者头像 李华
网站建设 2026/7/20 12:49:56

通达信量价筹K详解 源码

{}CW:CLOSEWINNER(CLOSE); HW:HIGHWINNER(HIGH); LW:LOWWINNER(LOW); OW:OPENWINNER(OPEN); AMV:SMA(VOL,N,1); 【最高】:AMV*HW/20; 【最低】:AMV*LW/20; 【收盘】:AMV*CW/20; 【开盘】:REF(【收盘】,1); 【三日】:MA(【收盘】,3); 【五日】:MA(【收盘】,5); 【十日】:MA(【收…

作者头像 李华