python GIL

Python GIL 系列之通过实例认识Python的GIL 1. 请看下面的例子: import time from threading import Thread from multiprocessing import Process from timeit import Timer def countdown(n):     while n > 0:         n -= 1 def t1():     COUNT=1000000 阅读详情


全局解释器锁(Global Interpreter Lock,缩写为GIL)是Python解释器(CPython)中的一个机制,它的作用是在同一时刻只允许一个线程执行Python字节码。也就是说,即便在多核CPU的环境下,Python的多线程也无法真正实现并行执行。下面为你详细介绍GIL的相关内容:

1. GIL的由来

  • 内存管理安全:CPython的内存管理并非线程安全的。GIL能够防止多个线程同时修改Python对象,从而避免出现竞态条件。
  • 简化实现:GIL使得CPython的实现更加简单,同时也简化了C扩展的编写。
  • 历史原因:早期的Python设计选择了GIL,这一设计对Python的发展产生了深远影响。

2. GIL的影响

  • I/O密集型任务:在执行I/O密集型任务时,线程在等待I/O操作时会释放GIL,其他线程便可以继续执行,因此多线程能够提升这类任务的效率。
  • CPU密集型任务:对于CPU密集型任务,由于GIL的存在,同一时刻只有一个线程能够执行Python代码,多线程不仅无法提升效率,反而可能因为线程切换的开销而导致性能下降。

下面通过一个简单的例子来直观感受GIL的影响:

import time
import threading

# CPU密集型任务
def cpu_bound(n):
    while n > 0:
        n -= 1

# 单线程执行
start = time.time()
cpu_bound(100000000)
print(f"单线程耗时: {time.time() - start:.2f}秒")

# 多线程执行
start = time.time()
t1 = threading.Thread(target=cpu_bound, args=(50000000,))
t2 = threading.Thread(target=cpu_bound, args=(50000000,))
t1.start()
t2.start()
t1.join()
t2.join()
print(f"双线程耗时: {time.time() - start:.2f}秒")

在这个例子中,双线程执行CPU密集型任务的耗时往往比单线程更长,这正是GIL造成的。
在这里插入图片描述

3. 如何绕过GIL的限制

  • 使用多进程:由于每个进程都有自己独立的Python解释器和GIL,因此多进程可以充分利用多核CPU。

    from multiprocessing import Process
    
    if __name__ == '__main__':
        p1 = Process(target=cpu_bound, args=(50000000,))
        p2 = Process(target=cpu_bound, args=(50000000,))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
    

    在这里插入图片描述

  • 使用C扩展:将CPU密集型任务放在C扩展模块中执行,在执行C代码时可以释放GIL。许多科学计算库(如NumPy)就是采用这种方式提升性能的。

4. GIL存在的必要性

虽然GIL在一定程度上限制了Python多线程的性能,但它也带来了一些好处:

  • 线程安全的内置数据结构:由于GIL的存在,Python的内置数据结构(如列表、字典等)不需要额外的锁机制,从而提高了单线程的性能。
  • 简化C扩展开发:开发者在编写C扩展时,无需过多考虑线程安全问题。

5. 其他Python解释器中的GIL

  • CPython:这是最常用的Python解释器,它实现了GIL。
  • Jython:基于Java的Python解释器,没有GIL。
  • IronPython:基于.NET的Python解释器,也没有GIL。
  • PyPy:使用JIT编译的Python解释器,同样实现了GIL。

6. 未来会移除GIL吗

虽然Python社区曾多次尝试移除GIL,但由于这会带来性能下降以及兼容性问题,目前GIL仍然存在于CPython中。在大多数情况下,开发者可以通过多进程、异步编程等方式来规避GIL的限制。

总结

GIL是CPython解释器的一个特性,它确保了线程安全,但也限制了多线程在CPU密集型任务中的性能。在编写Python代码时,要根据任务类型(I/O密集型或CPU密集型)选择合适的并发模型(多线程、多进程或异步编程)。

python的GIL锁(非常详细) 在了解python异步IO的过程中,接触到了python的GIL锁,找了许多国内外的资料,阅读完后发现较于其他博客中的说法有了更深的一些了解,因此写了这篇博客来进行记录,本文中的部分内容引用自real python,感觉是讲得最好的一份资料。 https://realpython.com/python-gil/ 一、GIL锁简介 简而言之,Python全局解释器锁或GIL是一种互斥锁(或锁),仅允许一个线程持有Python解释器的控制权。 这意味着在任何时间点只能有一个线程处于执行状态。对于执行单线程程 阅读详情

相关推荐

Python的GIL详解

GIL详解 GIL全称global interpreter lock,全局解释器锁,是 Python 解释器中的一个布尔值,受到互斥保护。这个锁被 CPython 中的核心字节码用来评估循环,并调节用来执行语句的当前线程。 每个线程在执行的时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU。执行单线程程序的开发人员看不到GIL的影响,但它可能是CPU绑定...

Alkaid的博客 4610

python线程常见问题

Python线程与GIL问题摘要: Python多线程受全局解释器锁(GIL)限制,同一时间仅一个线程执行字节码,导致CPU密集型任务无法并行加速,建议改用多进程(multiprocessing)。线程安全问题可通过锁(Lock)或线程安全队列(Queue)解决;死锁需规范锁的获取顺序。I/O密集型任务仍适用多线程(GIL会在I/O等待时释放)。线程间通信推荐Queue或Event,异常需内部捕获再传递。资源管理用with/try-finally,复杂场景建议线程池(ThreadPoolExecutor)。

doubleintfloat的博客 855

Python GIL锁

于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作)。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。所以虽然 CPython 的线程库直接封装操作系统的原生线程,但 CPython 进程做为一个整体,同一时间只会有一个获得了 GIL 的线程在跑,其它的线程都处于等待状态等着 GIL 的释放。

爱在深秋 1928

Python教程:一文掌握Python多线程(很详细)

多线程是指在同一进程内同时运行多个线程,每个线程执行不同的任务,实现并发执行。每个线程都有自己的执行路径,可以独立运行和调度,共享进程的资源。

旦莫的博客 3万+

【Python】 GIL

在深入Python多线程的细节之前,我们必须首先建立对并发(Concurrency)与并行(Parallelism)这两个核心概念的清晰理解。它们常常被混淆使用,但在计算机科学中,尤其是在讨论多核处理器和程序执行时,它们具有截然不同的含义。理解这两者是掌握任何并发编程范式的基石,也是理解Python中GIL存在必要性的前提。并发,从本质上讲,是关于**如何处理多个任务(或看起来同时执行的多个任务)**的能力。它侧重于管理,而不是真正意义上的同时执行。一个单核CPU也可以实现并发,通过快速切换任务(上下文切换

宅男很神经 1187

【Python】GIL

在深入GIL的运作机制之前,我们必须理解其诞生的历史背景和设计哲学。Python作为一种高级编程语言,其核心解释器CPython(最常用、官方的Python实现)最初并非为原生多线程并行计算而设计。它的设计者Guido van Rossum在早期面临着一个关键权衡:易用性与并发性。核心考量点:内存管理与引用计数: CPython内部采用了一种简单而高效的内存管理机制——引用计数。每个Python对象内部都有一个引用计数器。当有新的引用指向该对象时,计数器加一;当引用失效时,计数器减一。当计数器归零时,对象内

宅男很神经 1399

4、Python 多线程开发:问题 & 解决方法

Python 多线程开发:问题 & 解决方法

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 968

解决python线程卡死的问题

今天小编就为大家分享一篇解决python线程卡死的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python----线程(Threading)---线程安全问题 & 互斥锁 & 队列

文章目录1.线程安全的问题?2.线程安全产生的根源?3.原子操作?4.线程锁---互斥锁? 1.线程安全的问题? 因为线程之间存在资源竞争的情况,也就是说一个全局变量经过多个线程的共同操作,最终的结果出出现异常情况,这就是线程安全的问题 num = 0 def sum_one(quantity): global num for index in range(quantity): num += 1 return num t1 = Thread(target=

Alien-Hu 4639

PADS Layout差分对布线实战:从规则设置到高速信号优化

本文详细讲解了在PADS Layout中进行差分对布线的完整实战流程。从在Layout中定义差分对网络,到进入Router配置线宽、间距等关键规则,再到布线实战技巧与高速信号完整性优化,系统阐述了如何确保差分信号(如USB、HDMI)的稳定传输,是高速PCB设计的核心技能。

weixin_29274969的博客 521

手把手教你学Simulink--双足机器人分数阶PID控制仿真

分数阶PID(Fractional-order PID, FOPID)控制是一种先进的控制策略,它扩展了传统的整数阶PID控制器的概念。FOPID控制器允许积分和微分项的阶次不是严格的整数,而是可以是任意实数,这为系统提供了更多的设计自由度,并可能带来更好的性能。在双足机器人控制中,分数阶PID控制可以用于改善机器人的平衡控制、轨迹跟踪等任务的性能。下面我们将详细介绍如何使用Simulink进行基于分数阶PID控制方法的双足机器人仿真研究。

MHD0815的博客 879

Python之多进程与多线程

前言:为什么有人说 Python 的多线程是鸡肋,不是真正意义上的多线程? 看到这里,也许你会疑惑。这很正常,所以让我们带着问题来阅读本文章吧。问题: 1、Python多线程为什么耗时更长? 2、为什么在Python里面推荐使用多进程而不是多线程? 1 基础知识 现在的PC都是多核的,使用多线程能充分利用CPU来提供程序的执行效率。 1.1 线程 线程是一个基本的CPU执行单元。...

ZONGXP的博客 6万+

PotPlayer终极画质调校:深入MadVR渲染器设置,让你的显示器发挥100%潜力

本文深入探讨了如何通过MadVR渲染器优化PotPlayer的画质设置,充分发挥高端显卡和显示器的潜力。从色彩空间匹配、色深优化到HDR元数据处理,提供了一套完整的配置指南,帮助用户实现影院级视觉体验。特别适合拥有NVIDIA RTX或AMD RX系列显卡的用户进行精细调校。

weixin_42530458的博客 599

对 Python 中 GIL 的理解

Python 中的全局解释器锁(Global Interpreter Lock,GIL)是 CPython 解释器的一个机制,用来确保在多线程环境下,只有一个线程可以执行 Python 字节码,任何时刻只能有一个线程在执行 Python 代码。这意味着,即使有多个 CPU 核心,Python 的多线程程序在同一时间也只有一个线程在执行,无法充分利用多核处理器的优势。

NLP工程化 2195

AutoCAD2014与ObjectARX开发环境搭建实战指南

本文提供了一份详细的AutoCAD2014与ObjectARX开发环境搭建实战指南。内容涵盖从AutoCAD2014、Visual Studio 2010及ObjectARX 2014 SDK的版本匹配与环境准备,到Wizard安装、编码问题解决、Visual Studio配置,并最终通过一个完整的绘图命令开发示例,手把手引导开发者创建并加载第一个可运行的ObjectARX插件,为后续深入开发奠定坚实基础。

weixin_28475533的博客 286

28377D Bootloader

架构

a6100309120的博客 6012

什么是Python全局锁(GIL),如何避开GIL限制?

Python 全局解释器锁(Global Interpreter Lock, 简称GIL) 是一个互斥锁(或锁),只允许一个线程保持 Python 解释器的控制权。这意味着在任何时间点都只能有一个线程处于执行状态。执行单线程程序的开发人员看不到 GIL 的影响,但它可能是 CPU 密集型和多线程代码中的性能瓶颈。本文介绍了3种避开全局锁限制的方法:多进程编程,Cython, 其它解释器

Python技术探索 2万+

金蝶个版本下载地址,记得保存收藏。

专业版 V10.0 http://downloads.cmcloud.cn/kis/kis_pro/10.0/kiszybV10sp1.rar V11.0 http://downloads.cmcloud.cn/kis/kis_pro/11.0/KISV11Setup.rar V12.0 http://dow...

饺子的博客 2503

python中的GIL详解

python中的GIL详解 GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行

qq_33934427的博客 3075

PINN:当深度学习遇上朗伯-比尔定律

光谱数据处理中引入PINN的三种架构设计

qq_53529450的博客 154

物联网与人工智能项目实战:构建智能农业监控系统

智能农业监控系统通过物联网技术实时监测农业环境中的各项数据(如土壤湿度、温度、光照强度等),并利用人工智能技术分析和预测农业生产的趋势,进而为农民提供决策支持。系统的核心目标是提高农作物的产量和品质,同时减少资源浪费,优化农田管理。环境监测:实时采集农田的温湿度、土壤湿度、光照等环境数据。作物生长监测:通过传感器和图像识别技术监测作物的生长状况。智能灌溉系统:根据土壤湿度和气候条件自动调整灌溉量。病虫害检测与预警:利用人工智能和图像识别技术自动检测作物病虫害,并及时给出预警。数据分析与决策支持。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 709

2024年最全python中的GIL详解_gil数据

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

2401_84584763的博客 1576

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python的GIL锁

GIL锁

qq_45822672的博客 1635

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python GIL 详解

GIL 对 CPU 密集型任务有明显限制,多线程无法实现真正的并行。多线程适合 I/O 密集型任务,因为线程可以在等待 I/O 时释放 GIL。多进程是绕过 GIL 的有效方法,适用于需要充分利用多核 CPU 的场景。C 扩展模块(如 numba)可以帮助开发者规避 GIL 的限制,提高性能。

软件架构师笔记 1271

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python gil原理_Python GIL深入浅出

概述GIL(Global Interpreter Lock)是什么东东?为什么当一些Pythoners在开发一些多线程操作的时候,都会有些很多疑问?多线程真的很糟糕吗?我该如何实现多线程并发操作?今天博主带你详细的介绍一下GIL。GIL原理由于Python是动态解释性语言,即解释运行。运行Python代码时都会通过Python解释器解释执行,Python官方默认的解释器是Cython,当然你...

weixin_33168794的博客 294
上一篇: python线程常见问题
下一篇: C++根据配置文件灵活执行函数
越甲八千
博客等级 码龄11年 2954粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值