Cpython解释器中的GIL全局解释器锁


Posted in Python onNovember 09, 2020

1、什么是GIL全局解释器锁

GIL:Global Interpreter Lock,意思就是全局解释器锁,这个GIL并不是Python的特性,他是只在Cpython解释器里引入的一个概念,而在其他的语言编写的解释器里就没有GIL,例如:Jython,Pypy等

下面是官方给出的解释:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

翻译过来的意思就是:在CPython中,全局解释器锁(GIL)是一个互斥锁,可以防止多个本地线程同时执行Python字节码。这个锁是必要的,主要是因为CPython的内存管理不是线程安全的。(但是,由于GIL存在,其他特性已经发展到依赖于它所执行的保证。)

所以:

GIL本质上就是一把互斥锁,用来保证数据的正确性,使数据可以正常同步。

GIL就像是BUG一般存在的全局互斥锁,目前无法通过代码去除GIL

结论:在CPython解释器中,在同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势

PS:我们平常所使用的python是C语言编写的,所以大部分人所说的python也指CPython,CPython是python的官方版本,若是指其他语言写的python,一般情况下会指明,如Jypthon、Pypy等

2、为什么会出现GIL

随着电脑多核CPU的出现,python为了充分利用多核CPU,进行多线程的编程方式便普及了起来,但是随之而来的困难是线程之间数据的一致性和状态同步,python为了解决这个数据不能同步的问题,所以设计了GIL全局解释器锁,其实就是互斥锁

说到互斥锁,在多线程互斥锁中共享全局变量的时候会有线程对全局变量进行的资源竞争,会对全局变量的修改产生不是我们想要的结果,而那个时候用到的是python中线程模块里面的互斥锁。

如下例(未加线程互斥锁):

from threading import Threadimport time


n = 100
def task():
  global n
  m = n
  time.sleep(0.5)  # 模拟IO操作
  n = m - 1


if __name__ == '__main__':
  list1 = []
  for i in range(10):
    t = Thread(target=task)
    t.start()
    list1.append(t)

  for t in list1:
    t.join()

  print(n)

 执行结果:

99

在上面的例子里,我创建了10个线程来争夺对 n 进行 -1 操作,但是结果并非我想要的,所以我在这里加入了互斥锁

如下例(加线程互斥锁):

from threading import Thread
from threading import Lock
import time


n = 100
def task(lock):
  global n
  lock.acquire()  # 加锁
  m = n
  time.sleep(0.5)  # 模拟IO操作
  n = m - 1
  lock.release()  # 解锁


if __name__ == '__main__':
  list1 = []
  lock = Lock()
  for i in range(10):
    t = Thread(target=task, args=(lock, ))
    t.start()
    list1.append(t)

  for t in list1:
    t.join()

  print(n)

执行结果:

90

这次就可以得到我想要的结果

3、GIL的优缺点

优点:

保证数据的正确性

缺点:

单个进程下,开启多个线程,牺牲了执行效率,无法实现并行,只能实现并发

4、如何体现GIL全局解释器锁

在Cpython解释器中,当python代码有一个线程开始访问解释器的时候,GIL会把这个大锁给锁上,此时此刻其他的线程只能干等着,无法对解释器的资源进行访问,这一点就和互斥锁相似。而只是这个过程发生在我们的Cpython中,同时也需要等这个线程分配的时间到了,这个线程把GIL释放掉,类似互斥锁的lock.release()一样,另外其他的线程才开始跑起来。

Cpython解释器中的GIL全局解释器锁

以上就是Cpython解释器中的GIL全局解释器锁的详细内容,更多关于GIL全局解释器锁的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
Python 中迭代器与生成器实例详解
Mar 29 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
基于Python实现用户管理系统
Feb 26 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
pycharm中import呈现灰色原因的解决方法
Mar 04 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
如何从csv文件构建Tensorflow的数据集
Sep 21 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 #Python
基于python爬取梨视频实现过程解析
Nov 09 #Python
Python eval函数介绍及用法
Nov 09 #Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 #Python
python 用struct模块解决黏包问题
Nov 07 #Python
python hmac模块验证客户端的合法性
Nov 07 #Python
python如何利用paramiko执行服务器命令
Nov 07 #Python
You might like
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
javascript倒计时功能实现代码
2012/06/07 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Django之form组件自动校验数据实现
2020/01/14 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
学python需要去培训机构吗
2020/07/01 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
this关键字的作用
2016/01/30 面试题
数控机械专业个人的自我评价
2014/01/02 职场文书
教师师德承诺书
2014/03/26 职场文书
《春天来了》教学反思
2014/04/07 职场文书
清明节演讲稿
2014/05/27 职场文书
跑操口号
2014/06/12 职场文书
联谊活动总结范文
2015/05/09 职场文书
幼儿园辞职信
2015/05/13 职场文书