python gil 解除_python GIL的解读
前言
本篇文章主要是看完UnderstandingGIL.pdf后的一些理解
http://www.dabeaz.com/python/UnderstandingGIL.pdf
GIL什么是?
简单翻译一下:在CPython解释器下,全局解释器锁GIL是为了保证python多线程安全的一把互斥锁。这把锁是必要的,主要因为CPython的内存管理器不是线程安全的。(但是,自从GIL诞生后,所有其他功能都是基于GIL来实现了)
划重点:
1、GIL是一把在Cpython解释器下,针对多线程的全局互斥锁。
解读:Cpython解释器下的GIL,也就是说有些python解释器是不使用GIL的(但Cpython是主流)。
GIL是针对多线程的锁,所以跟多进程,协程什么的就不搭边啦。
2、这把锁是必要的。
解读:python的线程是真正的操作系统线程,python将线程的管理完全交由操作系统。(python认为操作系统自身的线程管理已经很好了,没必要再搞一套出来。感觉就像我们平时用标准库一样)这种设计的合理性在于当我们的CPU是单核时,GIL问题是不存在的,一个线程释放GIL时,任何一个线程被唤醒(也包括自身)都能获取到GIL,继续工作,等下一次再释放GIL时,依然是所有线程来获取GIL,如下图。但多核CPU时,现象是有所差别的,后面会继续分析。
3、其他功能都是基于GIL来实现
解读:这就解释了为啥这么多年过去了,在多核CPU盛行的情况下,GIL这种明显的性能瓶颈为什么依然去不掉,因为要改的实在太多了
GIL是如何工作的
关于python单核单进程,单核多进程,单核多线程,多核多进程,多核多线程的性能比较,本文就不再一一贴图了。结论上来讲,python的多核多线程要比单核单线程的性能还要差!
在了解GIL工作原理之前先提两个不太熟悉的概念:
1、Tick,可以理解为程序执行时的字节码(可能理解有误,没有找到官方的说明,需要用到dis.dis方法将代码转换成汇编后才能识别出1个tick)。一个简单的减法操作会用到4个tick。
2、OS Scheduing,操作系统在多任务操作时,会将待进行的任务写入的一个队列,并分配优先级。
下面要分情况讨论了(触发GIL释放有两种情况:I/O触发和ticks触发,这里不做划分,只分析单核和多核):
1、单核CPU情况
当线程1达到释放GIL的条件时,向操作系统发送释放GIL的信号(signal),操作系统拿到GIL后,把GIL分配给schedule队列准备好的线程2上,线程2拿到GIL后,进行上下文切换,开始工作。并且GIL有很大的几率依然会回到线程1,这样很好,减少了不必要的上下文切换。
2、多核CPU情况:
当线程1达到释放GIL的条件时,向操作系统发送释放GIL的信号(signal),操作系统拿到GIL后,把GIL分配给schedule队列,把此时和单核CPU出现差别。在多核下,可运行的线程们在每个CPU上都可以被唤醒,每个可以被唤醒的线程都认为自己可以去争抢这个GIL,但最终只有1个CPU上的线程能够抢到这个GIL,而其他被唤醒的线程发现没有GIL了,又接着回去干自己的工作,并且浪费了CPU的时间。感觉类似惊群效应,不知道这个理解是否合理
多核CPU多线程的解决方案
1、根据我们对定义的解读,既然GIL是Cpython解释器下的GIL,那么我们寻找一个不用GIL的python解释器就好了。(虽然理论上没毛病,但没见过这么做的)
2、等。等python版本更新,然后用新版本的python。没错,我们什么都不用做,python社区的大神们比我们更想解决这个问题。目前来看,从python3.2之后,引入了TIMEOUT来替换ticks的计数,这会使性能更好一些。
3、根据之前的分析,我们能够确定单核CPU的时候,是不存在GIL问题的,而GIL又是针对某个进程下的多线程。由此可以提出一种解决方案:把进程绑定到固定的CPU上,然后在这个进程下使用多线程处理业务。这时候,虽然计算性能比较依赖单个CPU的主频,但绕过了GIL,并发能力绝对是提高了。
介绍一个叫做affinity的包,将进程绑定到指定CPU用,之前写过一段小例子可供参考(自己对这种方案产生了怀疑-_-!)https://github.com/dsgdtc/understanding_bindingcpu
4、虽然说了GIL这么多的坏话,但并不意味着完全舍弃多线程了。
5、用协程,python3.6+后asyncio的支持越来越好了
参考资料
http://www.dabeaz.com/python/UnderstandingGIL.pdf
python gil 解除_python GIL的解读相关推荐
- python gil原理_Python GIL深入浅出
概述 GIL(Global Interpreter Lock)是什么东东?为什么当一些Pythoners在开发一些多线程操作的时候,都会有些很多疑问?多线程真的很糟糕吗?我该如何实现多线程并发操作?今 ...
- python gil锁_python GIL锁
为什么要有GIL GIL GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发.它也是 Python 中经常 ...
- python gil 解决_Python GIL问题
Python'最难'的问题--GIL问题 一.什么是GIL GIL(解释器全局锁) 从名字上看能告诉我们很多东西,很显然,这是一个加在解释器上的全局(从解释器的角度看)锁(从互斥或者类似角度看). 首 ...
- python gil锁_python GIL锁问题
一.GIL是什么 官方解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na ...
- gil 简述_python GIL简述
标签: 首先让我们了解一下并发和并行的概念:什么是并发什么是并行,他们的区别是什么? 举个简单的例子: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行. 你吃饭吃 ...
- python全局解释锁_Python GIL 全局解释性锁介绍
什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...
- python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)
通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...
- Python培训教程:什么是Python全局解释器锁(GIL)?
本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...
- 解释为脑瘫的那张图_Python GIL全局解释器锁详解(深度剖析)
通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL.GIL,中文译为全局解释器锁.在讲解 GI ...
最新文章
- 【网友的】《一个程序猿的生命周期》读后感
- 移植2.6.38内核到s3c6410问题
- Window服务的创建与删除
- Java虚拟机(JVM)面试题大集合
- Python PyCharm利用PyQt5使QPlainTextEdit支持拖放文件,类提升,重写QPlainTextEdit类
- JAVA8的新特性之函数式接口
- CMakeLists.txt是什么
- 在Debian上安装FlashPlayer10
- 好看的登录html界面,很漂亮的用户登录界面HTML模板
- nuxt项目添加百度统计的代码
- 计算机网络与云技术计算,计算机网络云计算技术(原稿)
- Windows下如何对声卡音频输出进行录音
- 教程丨手把手教你做数据挖掘 !(附教程数据源)
- 3D MAX 安装中的一些问题 一直初始化、闪退
- 【pandas之DataFrame相关函数】loc()函数、iloc函数
- 转 -- windows7 C盘空间越来越少?完美解决方案
- 机器学习模型 知乎_深度剖析知乎目前的内容架构模型
- 第一行代码Android(第三版)学习第一天
- 通俗易懂!看完你就是半个天线专家了
- 利用python改图片为任意颜色