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

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全局解释器锁的详细内容,更多关于GIL全局解释器锁的资料请关注我们其它相关文章!

(0)

相关推荐

  • 利用一个简单的例子窥探CPython内核的运行机制

    我最近花了一些时间在探索CPython,并且我想要在这里分享我的一些冒险经历.Allison Kaptur的excellent guide to getting started with Python internals有一点啰嗦,我想逐步介绍我自己的探索过程会更加有条理性,这样也许其他好奇的Python使用者可以跟着一起做. 1.注意到了一些奇怪的事情 一开始,我只是设置好Nose对一些我写的Python 3代码进行测试.当我运行这些测试的时候,我得到了一个不可思议的错误信息:"TypeErr

  • 如何配置关联Python 解释器 Anaconda的教程(图解)

    首先先安装好我们的Python 这里就不多介绍了 1.打开python.exe: 点击File 下的小扳手图标 Settings- 2.打开设置界面: 我们点击Project 这一栏下的 Project Interpreter 之后我们点击红色小方框 的小箭头 3.选择环境变量: 我们选择已有的两个环境变量中的其中一个 Python 3.7 点击下方的 Apply 等他加载成功后 我们点击OK 就完成了. 4.选择环境变量:另一种情况 我们发现下拉列表中没有可选择的环境变量时,点击右边的小齿轮,

  • Atom Python 配置Python3 解释器的方法

    环境 Mac Python3.6.4 Atom 背景 Atom 执行Python Code 使用Script Package,执行快捷键cmd + i. 但是默认是执行Mac 系统的2.7 版本的Python. 配置 cmd + ,(cmd + 逗号) 快捷键 打开Settings,或者点击Atom→Preferences 打开Settings 点击Open Config Folder(会打开Atom 的Project) 打开 .atom/packages/script/lib/grammars

  • 详解python编译器和解释器的区别

    高级语言不能直接被机器所理解执行,所以都需要一个翻译的阶段,解释型语言用到的是解释器,编译型语言用到的是编译器. 编译型语言通常的执行过程是:源代码--预处理器--编译器--目标代码--链接器--可执行程序. 某种意义上来说预处理事实上是一个附加的功能,C,PHP,都可以添加这种功能,其中,预处理指令多为头文件包含,宏定义等等.因为宏定义的核心说白了就是一个字"换",所以预处理就是提供一个程序执行的环境. 编译器--目标代码就是把高级程序语言转换成机器可以理解执行的机器语言. 链接器的

  • Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)

    这里介绍笔者在学习wordcloud库时安装过程中所遇到的问题和解决方案 1.在Pycharm中安装wordcloud出现的问题如下图所示 2.解决方法:在终端中通过wordcloud安装包安装方式,wordcloud的安装包下载链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 选择与自己Python版本想对应的即可,这里笔者Python是3.8的所以选择图中标记的,版本选择不匹配将会安装错误,如下图所示: 下载完成后打开终端通过p

  • PyCharm 配置远程python解释器和在本地修改服务器代码

    最近在学习机器学习的过程中,常常需要将本地写的代码传到GPU服务器中,然后在服务器上运行.之前的做法一直是先在本地写好代码,然后通过FileZilla这样的文件传输工具来将写好的文件传到服务器,再通过ssh工具远程连接到服务器,执行相应的python脚本.这样的方式十分繁琐,效率很低.今天听到朋友提到了配置远程解释器 使用场景 先说说自己的使用场景,我是在什么情况下,需要将IDE配置成这样的环境来方便我的工作. 首先,我需要在本地机子上写python代码,但是因为是机器学习相关的一些代码,有时候

  • mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法

    本文将介绍如何使用公司运行服务器进行开发调试,以及使用远程服务器python解释器,整理了对应的配置流程. 进入配置页面 Pycharm菜单栏,如下图所示,依次点击 Tools -> Deployment -> Configration- 开始配置连接服务器 1. Connection 选项设置: 具体参数说明: name 代码服务器配置名称 Type 协议类型,协议最好选择 SFTP Host.User name.Password 服务器配置相关信息 Root Path 为服务器项目运行的上

  • python解释器pycharm安装及环境变量配置教程图文详解

    1.python解释器安装 下载地址:https://www.python.org/ 打开官网,点击downloads,选择操作系统,以windows为例: 选择python2与python3解释器版本(以python3.6.6及python2.7.16为例): 以python3.6.6为例,根据操作系统下载不同安装包(python2.7.16类似) 下载完成后,双击打开,选择自定义安装: 点击完成后,选择下一步,修改默认安装路径(方便查找,添加环境变量),完成后点击安装 2.配置环境变量 右击

  • 安装好Pycharm后如何配置Python解释器简易教程

    这两天有许多Python小白加入学习群,并且问了许多关于Pycharm基本使用的问题,今天小编就以配置Python解释器的问题给大家简单絮叨一下. 1.一般来说,当我们启动Pycharm,如果Pycharm正常激活的话,就会直接进入到Pycharm中去,并且Pycharm经常会弹出下图的界面.(如果有小伙伴的Pycharm尚未激活,可以站内私信,小编这有好几个激活码,给大家分享.) 其实这个是Pycharm的提示信息,一般是Pycharm的简易或快捷方式介绍或者其他的Pycharm功能说明,大家

  • 详解pycharm配置python解释器的问题

    在这里选择使用哪个版本的interpreter: 下拉框里选择show all可以看见目前已有的 点击添加按钮: 可以选择system interpreter: 里面有所有现在电脑里安装的python,usr/bin/python和system目录下的是电脑自带的,usr/local/bin/python3是自己安装的.自己安装的python3是最底下的那个,这里usr下的,我理解为,是一种映射.usr/local/bin/python3是/Library路径下的python3的映射.因为我试了

随机推荐