Python中的GIL锁
Python中的GIL锁
在Python中,可以通过多进程、多线程和多协程来实现多任务。
在多线程的实现过程中,为了避免出现资源竞争问题,可以使用互斥锁来使线程同步(按顺序)执行。
但是,其实Python的CPython(C语言实现的)解释器上有一把GIL锁,也就是说Python的程序是处于一个解释器锁的环境中的。
一、GIL介绍
GIL (Global Interperter Lock) 称作全局解释器锁。
GIL并不是Python语言的特性,它是在实现Python解释器时引用的一个概念。GIL只在CPython解释器上存在。
不过,在Python的解释器中,使用最多的都是CPython解释器,所以我们不可避免的会遇到GIL。
在使用互斥锁解决代码中的资源竞争问题时,当一个线程执行时,会将全局共享的资源上锁,当线程执行完成后,将锁解开,释放资源,其他线程才能够使用。
GIL的作用与互斥锁的作用相似,是为了解决解释器中多个线程资源竞争的问题。
二、互斥锁和GIL的区别
互斥锁是运用在一个py文件中的,也就是在一个应用程序中,是代码层面的锁。
其实,Python解释器也是一个应用程序。只是说这个应用程序不是我们实现的,我们自己的python程序都要运行在解释器之上,这个应用程序被用来帮我们运行我们自己的程序。
线程互斥锁是Python代码层面的锁,解决我们自己写的Python程序中多线程共享资源的问题。
GIL是Python解释器层面的锁,解决解释器中多个线程的竞争资源问题。
三、GIL对程序的影响
1.Python中的多线程被称为“伪多线程”,因为无论如何,都逃不过GIL解释器锁。
2.因为GIL的存在,在Python中同一时刻有且只有一个线程会执行。
3.因为线程是存在于进程中的,线程是CPU调度和分派的基本单位,Python中的多线程由于GIL锁的存在无法利用多核 CPU。
4.GIL在程序中有IO操作时才切换到其他线程,所以Python中的多线程不适合计算密集型的程序,只适合IO密集型的程序。
既然GIL的存在使程序无法充分利用CPU进行运算,那么在IO密集型程序中为什么适合使用呢?
通常,程序分为两种,一种是计算密集型程序,另一种叫作IO密集型程序。
大部分的程序在运行时,都需要大量IO操作,比如网络数据的收发,大文件的读写,这样的程序称为IO密集型程序。
IO密集型程序在运行时,需要大量的时间进行等待,如果IO操作不完成,程序无法执行后面的操作,一直处于等待状态,导致CPU空闲。
由于GIL的存在,同一时刻只能有一个线程执行,在程序进行IO操作时,CPU实际并没有做任何工作,程序执行效率非常低。
为了提高CPU的使用率,Python解释在程序执行IO等待时,会释放GIL锁,让其它线程执行,提高Python程序的执行效率。
所以,GIL对于IO密集型的影响很小,多线程适合用来做IO密集型的程序。
四、如何改善GIL产生的问题
因为GIL锁是解释器层面的锁,无法去除GIL锁在执行程序时带来的问题。只能去改善。
1.更换更高版本的Python解释器,从3.2版本开始,Python开始对解释进行优化,虽然不能完全避开GIL,但是优化了总比优化前好。
2.Python程序如果是计算密集型的,或者是需要使用多核CPU的程序,可以使用多进程替代多线程(增强硬件然后使用多进程)。
3.GIL只存在于CPython解释器上,我们可以更换其他解释器,比如Jython(用JAVA实现的)。但是,由于使用的人少,支持的模块也较少,可能会导致有些模块不能使用,开发效率降低。一般不会采用这种方法。
Python中的GIL锁相关推荐
- 彻底弄懂Python中的GIL锁
彻底弄懂Python中的GIL锁 转载:https://blog.csdn.net/yushuaigee/article/details/86537474 刚学习python时,我关注了许多介绍pyt ...
- python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题
CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...
- python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...
- 深入理解Python中的GIL(全局解释器锁)
前言:本博文主要讲解Python中的GIL(全局解释器锁),本人经过查阅多个资料,摒弃一些较官方的描述,用自己的语言整理并加以补充,如果有描述有误的地方,还望读者在评论区指出,谢谢! 文章目录 一.G ...
- 深入理解Python中的GIL(全局解释器锁)。
Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁).这篇 ...
- Python中的GIL和深浅拷贝
Python中的GIL和深浅拷贝 文章目录 Python中的GIL和深浅拷贝 一.GIL全局解释器锁 1.引入 2.GIL 3.Python GIL底层实现原理 4.计算密集型和IO密集型 5.解决G ...
- c语言的锁和Python锁,Python中全局解释器锁、多线程和多进程
全局解释器锁(GIL)只允许1个Python线程控制Python解释器.这也就意味着同一时间点只能有1个Python线程运行.如果你的Python程序只有一个线程,那么全局解释器锁可能对你的影响不大, ...
- Python中的GIL和异步Asyncio、Futures
一 .基本概念 以下概念都是在 Python 环境下 Sync 同步编程 Async 异步 ,是指在外观上看来程序不会等待,而是找出可执行的操作/任务/线程 继续执行 Asyncio 单个主线程 多个 ...
- python中对GIL的理解
深入理解Python中的GIL(全局解释器锁) 1. GIL是什么? 首先来看看GIL究竟是什么.我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所 ...
最新文章
- 利用Linux或者Windows操作系统做路由器进行网络互连
- cookie 记住浏览历史
- 如何拓展外链引流,让网站成为“顶牛”?
- CSS布局--head区的其他设置
- Django Model 自动生成 E-R 图
- 微信小程序出现【需要进行身份验证】弹框解决方法
- 如何设置jinternalframe无边框_word文档美化技巧:加个边框提升版面颜值
- 杭电 1021 找规律
- 68 道Redis面试题
- 所有表单对象_表单太多汇总太累?请看这里,我们带你一键汇总
- Ubuntu下利用QSS、WPS破解wpa/wpa2加密
- Linux线程-概念和控制
- java myqq ui_myqq: Java版SWing“高”仿QQ即时通聊天系统
- 上月和本月对比叫什么_统计学中与上个月比叫什么
- 【夜读】做好这6件事,让人受益一生
- 完美用Nlite添加ACHI SATA驱动至XP镜像
- java线性规划计算最优解算法
- 【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码
- Error starting daemon: error initializing graphdriver: driver not supported
- 贾树森_(第三章)24种生活场景_(第四课)怎样自拍好看又不落俗套