感想:东看一篇文章西看一篇文章,终于把gil的概念理顺了

我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器

gil:全局解释器锁

存在原因:

早期设计python解释器时是单核时代,并没有考虑多核cpu情况

1.python的是使用引用计数的,当变量的引用计数为0就会被垃圾回收机制回收

2.python是解释型语言,默认的解析器cpython是将python语言翻译成c,再调用c函数实现执行python程序

3.线程与进程不同,是共享用户地址空间的,也就是共享全局变量

综上,如果同一个时刻有两个线程执行,那么全局变量的引用计数可能同时从0变成1,最终它的引用计数就是1,而却有两个线程在使用它,这显然是不对的.

解释:

全局:针对全局资源/同一个时刻,不管有多少个核,都只有一个线程能使用cpu资源

解释锁:cpython锁(C语言实现的Python解释器)

为什么java没有gil锁呢?

java实现了颗粒度更小的锁,而程序的执行顺序是:获取锁-执行程序-释放锁,所以增加了获取和释放锁的资源开销,所以全局锁这一把大锁其实也有好处,切换线程的资源浪费较少.

解释器怎么切换线程?

如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处于等待状态

哪种任务适合用多线程?

1、如果是CPU密集型代码(循环、计算等),由于计算工作量多和大,计算很快就会达到100,然后触发GIL的释放与在竞争,多个线程来回切换损耗资源,所以在多线程遇到CPU密集型代码时,单线程会比较快

2、如果是I\O密集型代码(文件处理、网络爬虫),开启多线程实际上是并发(不是并行),IO操作会进行IO等待,线程A等待时,自动切换到线程B,这样就提升了效率

怎么优化?

1.改用多进程,多个Python进程有各自独立的GIL锁

2.将计算代码转成c代码,使用调用c代码的接口,将cpu密集型任务切换成io任务:对所有面向I/O的(会调用内建的操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。我们可以把一些 计算密集型任务用C语言编写,然后把.so链接库内容加载到Python中,因为执行C代码,GIL锁会释放

与多进程使用变量的区别:

多进程:linux系统里面,fork出来的进程,其变量与源进程相同,如果只做读取,那么不会内存分配,如果发生写入,那么创建新内存页

缺点?

导致python无法实现真正意义上的多线程

Java吧 收集整理 java论坛 www.java8.com

python和c混合编程 gil_终于搞明白python与gil相关推荐

  1. 深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:arpit 译者:豌豆花下猫 声明:本翻译是出于交流学习的目 ...

  2. 一文搞明白Python并发编程和并行编程

    目录 前言 一.基础知识 1.并行和并发 (1)定义 (2)联系 2.进程.线程和协程 (1)定义 (2)联系 3.生成器 (1)yield (2)send, next (3)yield from 4 ...

  3. c python boost.python_如何利用Boost.Python实现Python C/C++混合编程详解

    前言 学习中如果碰到问题,参考官网例子:D:boost_1_61_0libspythontest 参考:Boost.Python 中英文文档. 利用Boost.Python实现Python C/C++ ...

  4. 终于搞明白gluPerspective和gluLookAt的关系了

    2019独角兽企业重金招聘Python工程师标准>>> 终于搞明白gluPerspective和gluLookAt的关系了 函数原型 gluLookAt(GLdoble eyex,G ...

  5. matlab中异步电机y接法,电机接法Y和三角形什么区别,今天终于搞明白了!

    原标题:电机接法Y和三角形什么区别,今天终于搞明白了! 电动机三角形接法和星形接法区别: 1.异步电动机因其结构简单.价格便宜.可靠性高等优点被广泛应用.但在起动过程中起动电流较大,所以容量大的电动机 ...

  6. Boost.Python实现Python C/C++混合编程

    导出函数 #include<string> #include<boost/python.hpp>using namespace std; using namespace boo ...

  7. python零基础有用吗-10天搞定Python,告诉你有什么用?

    掌握多一门编程语言,多一种选择,多一份机遇,更何况学的是人见人爱,花见花开的Python语言.它目前可占据编程语言排行榜的第3名,是名副其实的"探花郎",无论用它做什么(网络爬虫. ...

  8. 学python还是不会编程_你真的不学Python吗?学习Python的四大理由!

    在众多人的脑海中,Python无非就是一门编程语言而已,并没有什么特色,但是提及学习编程大部分人都会推荐Python,为什么?今天就给你说说学习Python的四大理由吧. 首先先来了解一下什么是Pyt ...

  9. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)

    任何复杂的概念或系统都不是凭空出现的,我们完全可以找到它的演化历程,寻根究底终会发现,其都是在一系列并不那么复杂的简单组件上发展演化而来! by 落花僧 本文通过一系列关键概念,逐步递进理解协程. 0 ...

最新文章

  1. 非递归一次性加载分类数据到TreeViw
  2. MyBatis在insert插入操作时返回主键ID的配置
  3. linux没有jre文件夹,linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法...
  4. leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
  5. 达“超人”水平?强化学习得这么用!
  6. Visual Studio Code的设置及插件同步
  7. 图解递归调用过程(Python)
  8. java监控gc线程_Java应用性能监控系统,使用JMX实现,实现了类加载监控、内存监控、线程监控、GC监控...
  9. Opening My World——ESRI用户大会有感
  10. 镭神C16上位机软件显示
  11. matlab从无到有系列(二):矩阵运算基础
  12. 解锁三星bl锁有几种方法_三星S8有几种解锁方式?三星S8解锁方法介绍
  13. FPGA作为电力电子设备控制器的实践
  14. 【面试题】计算机网络 -- 常见面试题总结
  15. java pv uv_什么是pv和uv?
  16. Person owns Dog...
  17. 关于Winxp U盘无法复制磁盘写保护解决办法
  18. 微信php开发 抽奖,微信(weixin)大转盘抽奖页面、数据库以及抽奖算法(PHP源码......
  19. ZRX的网络流题目总结
  20. python计算召回率_Pytorch 计算误判率,计算准确率,计算召回率的例子

热门文章

  1. 也说说TIME_WAIT状态
  2. 前端开发利器webStorm 3.0配置使用
  3. Exchange数据保护
  4. Practice:在2008 core上部署和管理DHCP服务器
  5. Dreamweaver 8和visual studio 2003一起开发是很爽的事
  6. 从系列去雨论文看如何创新
  7. TCP 拥塞窗口原理
  8. reactjs高阶函数和函数柯里化
  9. linux获取cpu核数(线程数)
  10. 基于operator sdk编写一个k8s自定义资源管理应用