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 相关文章推荐
python3 flask实现文件上传功能
Mar 20 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
Opencv实现抠图背景图替换功能
May 21 Python
pygame实现非图片按钮效果
Oct 29 Python
python异常处理try except过程解析
Feb 03 Python
tensorboard显示空白的解决
Feb 15 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
Python 多线程共享变量的实现示例
Apr 17 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
基于Python制作一副扑克牌过程详解
Oct 19 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
python_mask_array的用法
2020/02/18 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
2014教师个人自我评价范文
2014/09/13 职场文书
撤诉书怎么写
2015/05/19 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
同学会演讲稿
2019/04/02 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python