什么是GIL

GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着,一个Python进程内的线程只有先获得GIL,才能得到代码执行的机会,这个锁使得Python进程的多线程无法利用多核cpu带来性能提升。

但需要明确的一点是,GIL并不是Python的特性,而是CPython(最常用的Python解释器)的特性。这意味着我们可以使用其他的Python解释器从而绕过GIL的困扰,如JPython就没有GIL。但由于CPython是大部分环境下默认的Python解释器,而且Python社区大部分第三方库也依赖GIL这个特性提供的线程安全,由于这样的历史路径依赖,我们对GIL是欲罢不能。

看见GIL

接下来我们通过几个简单的例子来看看GIL对多核利用的影响

运行如下代码看看CPU的占用率

123456

def dead_loop():

while True:

pass

if __name__ == "__main__":

dead_loop()

测试的机器是个人 macbook pro,4个物理CPU,划分为8个逻辑CPU;可以看到该程序的确是把单核的占用跑满了;接着我们多开一个线程一起跑dead_loop,线程是CPU调度的基本单位,按道理两个线程应该并行运行,CPU占用应该提高一倍;

12345678910111213

import threading

def dead_loop():

while True:

pass

if __name__ == "__main__":

t = threading.Thread(target=dead_loop)

t.start()

dead_loop()

t.join()

如图,确实是运行了两个线程,但是只有一个线程是激活的,只跑满一个核,CPU的占用率依旧是 1⁄8 左右 【因为有其他用户程序,因此略高于 1⁄8 】。

作为对比,我们使用Golang跑两个线程看看。

123456789101112131415

package main

func main(){

ch := make(chan int, 0)

k := 1

for i:=0; i<2; i++{

go func() {

for ; k>0 ; {

}

}()

}

}

可以看到,Golang的确按照预期的那样,两个线程在死循环运行,CPU占用率达到总的 1⁄4 左右。

从以上的示例我们可以发现,GIL确实限制了Python进程的多线程对多核CPU的利用。

怎么办

使用其他解释器

GIL只是CPython的产物,像JPython和IronPython这样的解释器由于实现语言的特性,它们不需要GIL的帮助,但是由于用来Java/C#用于解释器的实现,它们也失去了利用社区众多C语言模块有用特性的机会。【Done is better than perfect】

用multiprocessing替代Thread

multiprocessing库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷,它使用了多进程而不是多线程,而每个进程有自己独立的GIL,因此不会出现进程间的GIL争抢。

但是multiprocessing也有其他麻烦,比如本来的多线程的同步和通信机制在多进程下就用不了了,拿计数器来举例子,如果要多个线程同时累加一个变量,对于thread来说,声明一个global变量,加个访问锁即可搞定;但是由于进程有自己独立的地址空间,无法直接访问彼此的变量数据,因此这个共享数据就必须从进程里提出到更高层的存储中,苦呀。

看看多进程的CPU占用

12345678910111213

import multiprocessing

def dead_loop():

while True:

pass

if __name__ == "__main__":

p = multiprocessing.Process(target=dead_loop)

p.start()

dead_loop()

p.join()

开了两个进程,俱跑满了单核

社区的努力

Python社区也一直在努力地改进GIL,甚至尝试去除GIL

将切换粒度从基于opcode计数改成基于时间片计数

避免最近一次释放GIL锁的线程再次被立即调度

新增线程优先级功能(高优先级可以迫使其他线程释放所持有的GIL锁)

总结

Python GIL是功能与性能之间权衡后的产物,虽然它的存在导致Python单进程的CPU密集型多线程形同虚设,但它有其存在的合理性【简单有用地实现线程安全】,也有其较难改变的客观因素【历史路径依赖】。

python全局解释锁_Python GIL 全局解释性锁介绍相关推荐

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

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

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

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

  3. python gil锁_python GIL锁

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

  4. python gil锁_python GIL锁问题

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

  5. Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程

    内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...

  6. python怎么解释语言_python属于解释语言吗

    Python是一门解释型语言? Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在. 如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写 ...

  7. python怎么解释语言_python是解释型语言吗

    Python 是解释型的语言吗?它会被编译吗? 这个问题没有想象中那么好回答.和很多人认识世界一样,习惯以一个简单的模型去评判一些事物.而事实上,里面包含了很多很多的细节. 通常的说法,编译代表着将一 ...

  8. python变量名包括_Python – 获取全局范围内对象的所有变量名

    我将用一个例子来解释: list_1 = [1, 2, 3] list_2 = list_3 = list_1 # reference copy print(magic_method(list_1)) ...

  9. python锁_Python中四种锁的使用示例(代码)

    本篇文章给大家带来的内容是关于Python中四种锁的使用示例(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Lock互斥锁 使用前num = 0 def a(): globa ...

最新文章

  1. ios开发-UI基础-应用管理(单纯界面)
  2. python人工智能-马哥教育官网-专业Linux培训班,Python培训机构
  3. Hadoop和Spark生态圈了解
  4. boost::statechart模块实现类型信息测试
  5. java路径在那_Java 路径
  6. csv文件的读写--示例
  7. 云计算平台构建与实验设计
  8. 电气-NPN、PNP传感器应用
  9. 计算机脚本发生错误,我的电脑开机后显示当前页面的脚本发生错误?
  10. Demo示例——Bundle打包和加载
  11. 录屏软件哪个好?快来试试这几款吧!
  12. 翻译:Tree Energy Loss: Towards Sparsely Annotated Semantic Segmentation
  13. Android应用在新浪微博授权提示:文件不存在 C8998 的解决方法
  14. 2022届测开秋招面经全记录
  15. eap wifi 证书_如何手动连接802.1x EAP证书加密WIFI
  16. darknet预测分类性能提升2.2:GPU加速resize_image()
  17. 编译原理第三章 词法分析与有穷自动机
  18. Java代码块(代码块与静态代码块使用细节及调用顺序)
  19. 解决一切运行库问题 运行库合集安装包、DirectX修复工具、.net最新合集包
  20. Vue 中引入markdown富文本编辑器并根据md格式渲染

热门文章

  1. SDN和SD-WAN有本质区别—Vecloud微云
  2. PostgreSQL系统表和视图
  3. Visual Studio 2015 安装
  4. 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
  5. 【敏捷测试】一个测试人员在参与敏捷测试的经验分享(3)
  6. 精通JavaScript--01面向对象JavaScript
  7. 4. SQL Server数据库状态监控 - 作业状态
  8. Leetcode 415. 字符串相加
  9. 卫星定位导航行业的产业链
  10. 新的GNSS精度度量是怎样定义的?