一、前言

  我的机器有4核,代表着同一时间,可以干4个任务。如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让我看上去是并发的。但是单核永远肯定时串行的,它肯定是串行的,cpu真正执行的时候,因为一会执行1,一会执行2.。。。。正常的线程就是这个样子的。

  但是,在python中,无论你有多少核,永远都是假象。无论你是4核,8核,还是16核.......不好意思,同一时间执行的线程只有一个(线程),它就是这个样子的。这个是python的一个开发时候,设计的一个缺陷,所以说python中的线程是假线程。

二、全局解释器锁(GIL)

2.1、英文解释

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.)

上面的核心意思就是:

  无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行。

2.2、GIL存在的意义?

  因为python的线程是调用操作系统的原生线程,这个原生线程就是C语言写的原生线程。因为python是用C写的,启动的时候就是调用的C语言的接口。因为启动的C语言的远程线程,那它要调这个线程去执行任务就必须知道上下文,所以python要去调C语言的接口的线程,必须要把这个上限问关系传给python,那就变成了一个我在加减的时候要让程序串行才能一次计算。就是先让线程1,再让线程2.......

  每个线程在执行的过程中,python解释器是控制不了的,因为是调的C语言的接口,超出了python的控制范围,python的控制范围是只在python解释器这一层,所以python控制不了C接口,它只能等结果。所以它不能控制让哪个线程先执行,因为是一块调用的,只要一执行,就是等结果,这个时候4个线程独自执行,所以结果就不一定正确了。有了GIL,就可以在同一时间只有一个线程能够工作。虽然这4个线程都启动了,但是同一时间我只能让一个线程拿到这个数据。其他的几个都干等。python启动的4个线程确确实实落到了这4个cpu上,但是为了避免出错。这也是Cpython的一个缺陷,其他语言没有,仅仅只是Cpython有。

2.3、GIL锁关系图

GIL(全局解释器锁)是加在python解释器里面的,效果如图:

为什么GIL锁要加在python解释器这一层,而却不加在其他地方?

  因为你python调用的所有线程都是原生线程。原生线程是通过C语言提供原生接口,相当于C语言的一个函数。你一调它,你就控制不了了它了,就必须等它给你返回结果。只要已通过python虚拟机,再往下就不受python控制了,就是C语言自己控制了。你加在python虚拟机以下,你是加不上去的。同一时间,只有一个线程穿过这个锁去真正执行。其他的线程,只能在python虚拟机这边等待。

三、总结

  首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。

  这篇文章透彻的剖析了GIL对python多线程的影响,强烈推荐看一下:猛击这里

转载于:https://www.cnblogs.com/zhangqigao/articles/7258364.html

day9-为什么会有GIL锁相关推荐

  1. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  2. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  3. 并发编程中的GIL锁(全局解释器锁)自己理解的他为啥存在

    自己的分析 GIL锁就是一个全局解释器锁 也就是python中因为有垃圾回收机制的存在.垃圾回收机制也是一个线程,如果所有的线程都可以使用cpu的不同资源(也就是多核 cpu并行处理线程的情况) -这 ...

  4. Cython屏蔽GIL锁实践

    环境: Ubuntu19.10 四核八线程. 题外话,八线程属于超线程概念,程序员不可控制,属于操作系统调度的工作. 基本概念: 什么时候使用并发/并行? 资料中有两种说法: 一种是: 涉及到多核就是 ...

  5. 一句话讲清楚GIL锁

    什么是"全局GIL锁" 全局指的是所有CPU, 锁指的每次是只有一个CPU的线程可以执行IO任务 银行四个窗口(进程),四个队伍的客户在排队办理业务, python中的" ...

  6. 递归锁、信号量、GIL锁、基于多线程的socket通信和进程池线程池

    递归锁.信号量.GIL锁.基于多线程的socket通信和进程池线程池 递归锁 死锁现象:是指两个或两个以上的进程和线程因抢夺计算机资源而产生的一种互相等待的现象 from threading impo ...

  7. python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解

    GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念. 1. GIL产生的背景: 在CPytho ...

  8. python 对象锁_也许你对 Python GIL 锁的理解是 错的。

    摄影:产品经理甜白与草莓更配~ 我刚到现在这个公司时,听到当时一个高级工程师(现已离职)大声地跟他旁边的同事说:  Python 有 GIL 锁,所以它的多线程实际上是单线程,所以写多线程代码不用考 ...

  9. Python GIL 锁 - Python零基础入门教程

    目录 一.并行和并发 二.GIL 锁 案例一:单核多线程 案例二:单核多线程 案例三:双核多线程 三.如何解决 GIL 锁问题 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习 ...

  10. Python中的GIL锁

    Python中的GIL锁 在Python中,可以通过多进程.多线程和多协程来实现多任务. 在多线程的实现过程中,为了避免出现资源竞争问题,可以使用互斥锁来使线程同步(按顺序)执行. 但是,其实Pyth ...

最新文章

  1. 让你热血沸腾的电竞直播,有一群深藏不露的技术极客
  2. IE新0day漏洞(979352)(又称极光零日漏洞)***将扩散
  3. about osgeo中国
  4. 代码混淆android.mk,利用ollvm进行代码混淆
  5. STM32之独立看门狗原理
  6. node.js调用外部接口
  7. IE、Chrome、Firefox 三大浏览器对比
  8. 【Gym - 101848D】XOR【多个数异或的典型问题】【费马小定理】
  9. Java视频教程下载地址汇总
  10. 一文读懂矩估计、极大似然估计和贝叶斯估计
  11. Linux下如何彻底删除用户
  12. 2018 软件学院 AK 杯 题解
  13. login shell和non-login shell
  14. c语言 的表示方法,c语言运算符号的表示方法
  15. 小米9se是Android6吗,小米9SE评测 优缺点十分明显
  16. 每周小节-2 d3-zoom,pan,brush阅读心得 d3.js on angular读书笔记
  17. Webkit是什么?(Chrome浏览器的核心)
  18. Flink知识点总结 Flink简介
  19. 套汇问题 Floyd
  20. xchariot使用笔记

热门文章

  1. Track'em Down
  2. undefsafe原型链[网鼎杯 2020 青龙组]notes
  3. modprobe ipmi_si报错问题
  4. VSCode用Run code插件配置python环境(win10)
  5. 第4章 Stata参数检验
  6. 64 ---- 两平面的位置关系
  7. shell if -n 参数
  8. java 编辑PDF 文件,或者填充数据
  9. AI创业时代!这9个方向有钱途;AIGC再添霸榜应用Lensa;美团SemEval2022冠军方法分享;医学图像处理工具箱… | ShowMeAI资讯日报
  10. 移动互联网应用的十项设计原则和小提示