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中 ? : 三元表达式的使用介绍
Oct 09 Python
简单说明Python中的装饰器的用法
Apr 24 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
selenium+python自动化测试环境搭建步骤
Jun 03 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
python实现代码统计程序
Sep 19 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
django实现支付宝支付实例讲解
Oct 17 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
python os.listdir()乱码解决方案
Jan 31 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
用PHP+MySql编写聊天室
2006/10/09 PHP
php session和cookie使用说明
2010/04/07 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
php集成动态口令认证
2016/07/21 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
经验几则 推荐
2006/09/05 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
javascript连续赋值问题
2015/07/08 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
angularJS开发注意事项
2018/05/26 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
python实现从字典中删除元素的方法
2015/05/04 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python双向链表原理与实现方法详解
2019/12/03 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
python中Mako库实例用法
2020/12/31 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
纪检监察建议书
2014/05/19 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
党员个人剖析材料
2014/09/30 职场文书
小学老师对学生的评语
2014/12/29 职场文书