Python 中的 GIL 是什么?对多线程有什么影响?
Python 中的 GIL 是什么对多线程有什么影响Python 中的 GIL深入解析及其对多线程的影响什么是 GILGILGlobal Interpreter Lock全局解释器锁是 CPython 解释器Python 最常用的实现中的一个机制它确保在任何时刻只有一个线程在执行 Python 字节码。这意味着即使在多核处理器上运行多线程 Python 程序也只有一个线程能够真正同时执行 Python 代码。GIL 的工作原理GIL 本质上是一个互斥锁它保护着 Python 解释器内部的数据结构防止多个线程同时访问和修改这些结构。当一个线程想要执行 Python 字节码时它必须先获取 GIL执行一段时间后释放然后其他线程才有机会获取 GIL 并执行。# 简化的 GIL 工作流程示意importthreadingdefthread_function():# 线程尝试获取 GIL# 如果 GIL 被其他线程持有则等待# 获取 GIL 后执行 Python 代码# 执行一段时间后释放 GILpass为什么需要 GILGIL 的存在主要有以下原因简化内存管理Python 使用引用计数进行内存管理GIL 防止了多个线程同时修改引用计数导致的竞争条件保护内部数据结构确保解释器内部状态的一致性历史原因Python 诞生时多核处理器还不普及单线程性能是主要关注点C 扩展兼容性许多 C 扩展依赖 GIL 来保证线程安全GIL 对多线程的影响1. CPU 密集型任务受限对于 CPU 密集型任务GIL 会显著限制多线程的性能提升因为线程需要轮流获取 GIL 才能执行。importthreadingimporttimedefcpu_intensive_task(n):count0foriinrange(n):countireturncountdeftest_with_threads():start_timetime.time()threads[]for_inrange(4):tthreading.Thread(targetcpu_intensive_task,args(100000000,))threads.append(t)t.start()fortinthreads:t.join()print(f多线程执行时间:{time.time()-start_time:.2f}秒)deftest_single_thread():start_timetime.time()for_inrange(4):cpu_intensive_task(100000000)print(f单线程执行时间:{time.time()-start_time:.2f}秒)# 运行测试if__name____main__:test_single_thread()test_with_threads()结果分析在多核 CPU 上多线程版本可能不会比单线程快很多甚至可能更慢因为线程切换和 GIL 争抢带来了额外开销。2. I/O 密集型任务受益对于 I/O 密集型任务如网络请求、文件读写GIL 的影响较小因为线程在等待 I/O 操作时会释放 GIL允许其他线程执行。importthreadingimporttimeimportrequestsdefio_intensive_task(url):# I/O 操作期间会释放 GILresponserequests.get(url)returnlen(response.text)deftest_io_with_threads():urls[https://www.python.org,https://www.github.com,https://www.stackoverflow.com,https://www.google.com]start_timetime.time()threads[]results[]forurlinurls:tthreading.Thread(targetlambdauurl:results.append(io_intensive_task(u)))threads.append(t)t.start()fortinthreads:t.join()print(f多线程 I/O 任务执行时间:{time.time()-start_time:.2f}秒)print(f获取的总数据量:{sum(results)}字符)# 这种情况下多线程能显著提升性能3. 真正的并行计算受限由于 GIL 的限制Python 线程无法实现真正的并行计算。对于需要充分利用多核 CPU 的并行计算任务需要考虑其他方案。绕过 GIL 限制的方案1. 使用多进程multiprocessing多进程可以绕过 GIL因为每个进程有自己独立的 Python 解释器和内存空间。importmultiprocessingimporttimedefcpu_intensive_task(n):count0foriinrange(n):countireturncountdeftest_with_processes():start_timetime.time()processes[]for_inrange(4):pmultiprocessing.Process(targetcpu_intensive_task,args(100000000,))processes.append(p)p.start()forpinprocesses:p.join()print(f多进程执行时间:{time.time()-start_time:.2f}秒)# 多进程能真正利用多核 CPU2. 使用异步编程asyncio对于 I/O 密集型任务异步编程可以更高效地处理并发。importasyncioimportaiohttpimporttimeasyncdeffetch_url(session,url):asyncwithsession.get(url)asresponse:returnlen(awaitresponse.text())asyncdefmain():urls[https://www.python.org,https://www.github.com,https://www.stackoverflow.com,https://www.google.com]start_timetime.time()asyncwithaiohttp.ClientSession()assession:tasks[fetch_url(session,url)forurlinurls]resultsawaitasyncio.gather(*tasks)print(f异步执行时间:{time.time()-start_time:.2f}秒)print(f获取的总数据量:{sum(results)}字符)# asyncio.run(main())3. 使用其他 Python 实现Jython运行在 JVM 上没有 GILIronPython运行在 .NET 平台上没有 GILPyPy有 GIL但通过 JIT 编译优化性能4. 使用 C 扩展在 C 扩展中可以释放 GIL 来执行计算密集型操作。// C 扩展示例在执行计算时释放 GILPy_BEGIN_ALLOW_THREADS// 执行不涉及 Python 对象的计算密集型操作Py_END_ALLOW_THREADSGIL 的未来Python 社区一直在讨论移除 GIL 的可能性Python 3.11 的改进通过优化解释器减少 GIL 的影响nogil 分支有一些实验性分支尝试移除 GIL子解释器提案PEP 684 提出了每个子解释器有自己的 GIL最佳实践建议CPU 密集型任务使用multiprocessing、concurrent.futures.ProcessPoolExecutor或第三方库如joblibI/O 密集型任务使用threading、asyncio或concurrent.futures.ThreadPoolExecutor混合任务结合多进程和多线程或使用asyncio与线程池数值计算使用numpy、pandas等库它们的核心操作在 C 层释放了 GIL机器学习使用scikit-learn、tensorflow、pytorch等库它们内部处理了并行化总结GIL 是 CPython 的一个设计选择它简化了内存管理和 C 扩展的开发但限制了多线程在 CPU 密集型任务中的并行能力。理解 GIL 的工作原理和影响可以帮助开发者选择正确的并发策略对于 I/O 密集型应用多线程仍然是有效的对于 CPU 密集型应用应考虑多进程或其他并行计算方案随着 Python 的发展未来可能会有更多绕过或减少 GIL 影响的方案正确理解和使用 Python 的并发工具可以在不同场景下获得最佳性能表现。

相关新闻

CLAP音频分类控制台:音乐识别、环境音监测实战演示

CLAP音频分类控制台:音乐识别、环境音监测实战演示

CLAP音频分类控制台:音乐识别、环境音监测实战演示 1. 项目概述与核心价值 今天我要向大家介绍一个非常实用的音频识别工具——CLAP音频分类控制台。这是一个基于LAION CLAP模型构建的交互式应用,能够让你用自然语言描述来识别任意音频内容&#xff0c…

2026/5/17 4:46:18 阅读更多 →
WuliArt Qwen-Image Turbo运维手册:日志轮转+磁盘清理+服务自愈配置

WuliArt Qwen-Image Turbo运维手册:日志轮转+磁盘清理+服务自愈配置

WuliArt Qwen-Image Turbo运维手册:日志轮转磁盘清理服务自愈配置 1. 项目概述 WuliArt Qwen-Image Turbo是一款专为个人GPU环境设计的轻量级文本生成图像系统。该系统基于阿里通义千问Qwen-Image-2512文生图模型,深度融合了Wuli-Art专属Turbo LoRA微调…

2026/7/4 15:29:19 阅读更多 →
SeqGPT-560M开源大模型效果对比:在中文法律文本NER任务中超越BERT-base

SeqGPT-560M开源大模型效果对比:在中文法律文本NER任务中超越BERT-base

SeqGPT-560M开源大模型效果对比:在中文法律文本NER任务中超越BERT-base 1. 项目概述 SeqGPT-560M是一个专门为企业级信息抽取任务设计的开源大模型,基于先进的序列生成架构构建。这个模型在中文法律文本的命名实体识别(NER)任务…

2026/5/17 4:46:15 阅读更多 →

最新新闻

大模型落地转向:从跑分游戏到全面实用

大模型落地转向:从跑分游戏到全面实用

1. 项目概述:一场大模型落地逻辑的悄然转向 “腾讯混元 重组 90 天交卷:放弃‘跑分游戏’,走向‘全面实用’”——这个标题不是一次常规的产品迭代通报,而是一份写给整个AI产业界的技术路线修正声明。它背后折射出的,是…

2026/7/4 15:28:28 阅读更多 →
3分钟学会AI智能图像分层:免费开源工具让复杂插画秒变PSD图层

3分钟学会AI智能图像分层:免费开源工具让复杂插画秒变PSD图层

3分钟学会AI智能图像分层:免费开源工具让复杂插画秒变PSD图层 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为提取插画中的单个元素而烦…

2026/7/4 15:26:28 阅读更多 →
AI智能体架构设计与多智能体协作系统开发指南

AI智能体架构设计与多智能体协作系统开发指南

1. AI智能体的进化与核心架构设计 AI智能体已经从早期的简单对话机器人(如2016年的客服聊天机器人)进化成了具备自主决策能力的复杂系统。这种进化主要体现在三个关键能力上:目标拆解、长期记忆和环境交互。要理解现代AI智能体的开发&#xf…

2026/7/4 15:26:28 阅读更多 →
AntiDupl图片去重技术指南:基于内容相似度检测的智能解决方案

AntiDupl图片去重技术指南:基于内容相似度检测的智能解决方案

AntiDupl图片去重技术指南:基于内容相似度检测的智能解决方案 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 在现代数字资产管理中,图片去重已…

2026/7/4 15:24:28 阅读更多 →
用乐高和彩虹糖教孩子理解机器学习

用乐高和彩虹糖教孩子理解机器学习

1. 这不是在教算法,是在帮孩子建立“模式直觉”你有没有试过,蹲下来,用孩子能听懂的话解释一个成年人觉得理所当然的概念?我做过上百场面向小学生的科技启蒙工作坊,每次开场前,我都会把手机里存着的三张图调…

2026/7/4 15:22:27 阅读更多 →
从Notebook到生产:MLOps模型服务化实战指南

从Notebook到生产:MLOps模型服务化实战指南

1. 项目概述:这不是一次“部署”,而是一场从实验室到产线的系统性迁移 “From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着太多被日常忽略的真相。它不是教你怎么把 model.fit() 换成 model.predict() &…

2026/7/4 15:20:27 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻