GIL

先声明一下,原本没打算写这么多,但是写着写着发现,需要解释的东西太多了,一个套一个,其实我现在总结的这一版还是没有完全到每一个细节,但是我想靠这些应该差不多了。我想了一下大概还有两个没讲,1.为什么还用GIL 2.垃圾回收机制
什么是GIL?

GIL是cPython解释器的特有技术术语,中文为全局解释器锁。因为在创建Python的时候只考虑到单核的cpu

GIL的功能?

GIL的功能就是:在执行Python线程的时候,先锁住自身线程,实现同一时间只允许执行一个进程。
解决多线程之间数据完整性和状态同步的最简单方式就是加锁。 最重要的是能够帮助cpython解决其在内存管理中存在的线程不安全的问题。

GIL的运行方式?

1.某个线程拿到GIL
2.该线程执行代码,直到达到了check_interval(Python2中,check_interval是当前线程遇到io操作或者ticks计数达到100,Python3中是执行时间达到阀值15毫秒)
3.cpython让当前线程释放GIL
4.所有线程开始竞争GIL
5.竞争到GIL锁的线程,又开始从第一步开始

GIL存在对程序或者进程有什么影响?

由于Python线程的这种特性,导致Python在使用多线程进行处理多任务计算的时候,不能实现真正的并行操作;但是由于cpu的分片机制,会在运行一个线程一段时间后,切换到另一个线程(时间很快,感觉不到),从而达到伪并行的效果

为什么还需要GIL?

这和cpython的底层内存管理有关。cpython使用引用计数来管理内存,所有的Python脚本中创建的实例,都会配备一个引用计数,来记录有多少个指针来指向它。当实例对象的引用计数值为0的时候,会自动释放其所占的内存。
假如两个线程同时引用同一个变量,会造成引用计数的条件竞争,导致引用计数只增加1(实际应该增加2),这就有可能导致在第一个线程结束后,引用计数减1,正好达到释放内存的条件(引用计数为0),在当第二个线程再次访问变量的时候,无法找到有效的内存了。但是使用了GIL就可以避免这种问题,在第一个线程申请使用变量的时候,先加锁,当第二个线程使用的时候,第一个线程先释放锁,第二个线程同时加锁,就避免了变量的引用计数减少的情况

为什么Python线程会主动释放GIL?

前面讲到Python线程在执行前,会先上锁。如果不释放锁(也就是GIL)不就永远不会实现多线程,别的线程永远没有机会。这就涉及到cpython的另一个机制:间隔式检查,cpython会轮询检查线程GIL锁的情况,每隔一段时间,cpython就会强制当前线程去释放GIL,这样别的线程就可以执行了

cPython的GIL相关推荐

  1. 并发编程——线程——CPython的GIL解释器锁

    一.GIL定义 In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native th ...

  2. 【Cpython的GIL详细了解一下?】

    简单解释 全局解释器锁(Global Interpreter Lock,简称 GIL)是 CPython 解释器内部的一个同步原语,它用于在同一时间只允许一个线程执行 Python 字节码. GIL ...

  3. Python全局解释器锁GIL与多线程

    Python中如果是 I/O密集型的操作,用多线程(协程Asyncio.线程Threading),如果I/O操作很慢,需要很多任务/线程协同操作,用Asyncio,如果需要有限数量的任务/线程,那么使 ...

  4. GIL(全局解释器锁)与互斥锁

    针对Cpython所拥有的GIL锁作用:由于Cpython解释器在运行python文件时, Cpython进程与其运行文件所产生的主进程是一个进程(文件进程相当于Cpython的一个线程) 线程的特点 ...

  5. Python中的GIL和深浅拷贝

    Python中的GIL和深浅拷贝 文章目录 Python中的GIL和深浅拷贝 一.GIL全局解释器锁 1.引入 2.GIL 3.Python GIL底层实现原理 4.计算密集型和IO密集型 5.解决G ...

  6. 解释为脑瘫的那张图_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL.GIL,中文译为全局解释器锁.在讲解 GI ...

  7. GIL , 线程池 , 同步 , 异步 , 队列 , 事件

    一.什么是GIL 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multipl ...

  8. python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...

  9. python 线程, GIL 和 ctypes

    1 GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题, 运行下面这段 python 程序,CPU 占用率会到多少: [py ...

最新文章

  1. 激光雷达:最新趋势之基于RangeView的3D物体检测算法
  2. 暴力求解法 之 枚举排列
  3. SAP BASIS 工作台请求和定制请求的区别
  4. CentOS7添加Nginx为系统服务
  5. 施工工期计算器在线_办公室装修工期要多久时间,办公室快速装修怎么做?
  6. jacket for matlab,打印本页 - 在联想系统上使用Jacket For Matlab
  7. 图解:如何修改CSDN账号昵称?
  8. 【产品】保险业务收付管理系统概要
  9. 互联网+电子招投标,正成为一种趋势
  10. python-坦克射击飞机
  11. DongDong认亲戚 来源:牛客网
  12. TensorFlow中的小知识:tf.flags.DEFINE_xxx()
  13. 今日头条——面试案例
  14. nginx 如何查看访问ip和对应访问路径
  15. componentDidMount,react
  16. 工业机器人在线示教编程和离线编程
  17. SWUST OJ 574: Renting Boats
  18. 生信学习——R语言练习题-初级(附详细答案解读)
  19. 合合信息获中国图象图形学学会科技进步奖二等奖
  20. OCR到底哪家强?清描:一款多功能图文识别工具

热门文章

  1. mSystems:华南农大揭示水稻SST基因调控根际微生物协同耐盐机制
  2. 高效的六面体变换算法实现(一) —— 等圆柱映射 与 六面体映射(MarkDown编辑器版)
  3. FreeCoddeCamp__js算法与数据结构__正则表达式
  4. 一种可以使汽车气缸密封并润滑的机油添加剂
  5. Cargo更换国内源
  6. uni.getLocation获取位置失败
  7. VM安装centos7并远程连接
  8. 为什么老师说尽量别用wps
  9. 转自kuangbin的AC自动机(赛前最后一博)
  10. 计算机视觉——PyCharm连接远程服务器和Linux Screen命令使用