前言

本篇文章主要是看完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的解读相关推荐

  1. python gil原理_Python GIL深入浅出

    概述 GIL(Global Interpreter Lock)是什么东东?为什么当一些Pythoners在开发一些多线程操作的时候,都会有些很多疑问?多线程真的很糟糕吗?我该如何实现多线程并发操作?今 ...

  2. python gil锁_python GIL锁

    为什么要有GIL GIL GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发.它也是 Python 中经常 ...

  3. python gil 解决_Python GIL问题

    Python'最难'的问题--GIL问题 一.什么是GIL GIL(解释器全局锁) 从名字上看能告诉我们很多东西,很显然,这是一个加在解释器上的全局(从解释器的角度看)锁(从互斥或者类似角度看). 首 ...

  4. python gil锁_python GIL锁问题

    一.GIL是什么 官方解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na ...

  5. gil 简述_python GIL简述

    标签: 首先让我们了解一下并发和并行的概念:什么是并发什么是并行,他们的区别是什么? 举个简单的例子: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行. 你吃饭吃 ...

  6. python全局解释锁_Python GIL 全局解释性锁介绍

    什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...

  7. python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...

  8. Python培训教程:什么是Python全局解释器锁(GIL)?

    本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...

  9. 解释为脑瘫的那张图_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL.GIL,中文译为全局解释器锁.在讲解 GI ...

最新文章

  1. 【网友的】《一个程序猿的生命周期》读后感
  2. 移植2.6.38内核到s3c6410问题
  3. Window服务的创建与删除
  4. Java虚拟机(JVM)面试题大集合
  5. Python PyCharm利用PyQt5使QPlainTextEdit支持拖放文件,类提升,重写QPlainTextEdit类
  6. JAVA8的新特性之函数式接口
  7. CMakeLists.txt是什么
  8. 在Debian上安装FlashPlayer10
  9. 好看的登录html界面,很漂亮的用户登录界面HTML模板
  10. nuxt项目添加百度统计的代码
  11. 计算机网络与云技术计算,计算机网络云计算技术(原稿)
  12. Windows下如何对声卡音频输出进行录音
  13. 教程丨手把手教你做数据挖掘 !(附教程数据源)
  14. 3D MAX 安装中的一些问题 一直初始化、闪退
  15. 【pandas之DataFrame相关函数】loc()函数、iloc函数
  16. 转 -- windows7 C盘空间越来越少?完美解决方案
  17. 机器学习模型 知乎_深度剖析知乎目前的内容架构模型
  18. 第一行代码Android(第三版)学习第一天
  19. 通俗易懂!看完你就是半个天线专家了
  20. 利用python改图片为任意颜色

热门文章

  1. 剑指offer:面试题07. 重建二叉树
  2. 球面贴图,立方体贴图的比较
  3. 【力扣网练习题】有效的括号
  4. UE中的自动化学习课程
  5. Unity + SQL数据库创建管理玩家排行榜学习教程
  6. big endian little endian
  7. 《C++primer》第二章--变量和基本内置类型
  8. python框架之Flask基础篇(一)
  9. MySQL 错误代码和消息
  10. object expected错误解决方法