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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容