深入Python并发编程(二)详解GIL锁

本文详细解析Python中全局解释器锁(GIL)的概念、历史原因及其对多线程的影响,探讨GIL锁的常见误解,并对比并发与并行、同步与异步以及I/O密集型与计算密集型的区别。

啥是GIL锁
  • GIL锁是全局解释器锁的英文缩写
  • GIL锁限制了Python在一个进程里面的多个线程在同一时间点只能运行其中的一个。
  • 即使我们计算机有4个核8个核,Python同一进程里面的线程也不能同时跑起来。但是在其他语言是可以的。所以很多人说Python的多线程是个假象
  • CPython解释器是直接调用操作系统的原生线程,就是C语言的线程,它直接调用C语言的线程接口
  • 但是其他语言比如Java,C++,它们是自己实现的线程,可以底层控制CPU
GIL的历史原因
  • Python是很早写出来的,那时候计算机大多数是多核的,可能Python创始人当时没有考虑到

  • 创始人他是有自己的考虑的,他在解释器层面上加一把锁,目的就是为了在解释器的层面上保证线程安全。

  • 什么叫解释器层面上呢?

  • 比如说我们的程序在跑,另外解释器层面上还有一个线程在跑着垃圾回收

  • 我们赋值x=1又赋值x=2那么那个1因为没有变量指向他。所以就会被Python垃圾回收机制回收,它不是立刻被回收,而是刷新一下,发现1那个变量是垃圾了,才把他回收掉

  • 有了GIL锁,这样我们就不用自己加锁(非常麻烦),所以说GIL锁也不是一无是处。

为啥Python加GIL锁
  • 简单说就是在解释器层面上保证线程的安全
  • 假设你的线程删除了一个变量,py解释器的垃圾回收线程在清空这个变量的过程中的clearing时刻,可能一个其它线程正好又重新给这个还没来及得清空的内存空间赋值了,结果就有可能新赋值的数据被删除了,为了解决类似的问题,python解释器简单粗暴的加了锁,即当一个线程运行时,其它人都不能动,这样就解决了上述的问题,
GIL锁的常见误区
  • 但是需要注意的是,GIL锁不是Python的缺陷,在JPython里面就没有这东西,它是CPython解释器里面的
  • 现在开发Python那群人也想把GIL锁去掉,但是去掉的话Python的效率就更低了。
  • Python它的很多库,很多组件,都是以有GIL锁为前提开发的,把GIL干掉,那么就相当于推掉重来,重新写一门语言。
并发与并行的区别
  • 并发:系统具有处理多个任务的能力,这种处理多个任务是看起来多个线程在同时进行,其实是在多个线程之间来回的快速进行上下文的切换(线程的切换),上下文切换的底层是,我们的操作系统,先把旧的任务的CPU寄存器,程序计数器保存起来,然后把新的任务的上下文加载到这里面,最后再跳转到程序计数器所指的新位置,执行任务(上下文切换消耗CPU性能)
  • 并行:指的是系统在同一个时间点真真正正地运行着多个任务
  • 并行包括并发
同步与异步的区别
  • 同步:当一个进程执行到一个I/O的时候,也就是比如说在收发数据的时候,等待这个I/O过程结束后再运行后面的程序
  • 异步:就是不等待
I/O密集型与计算密集型
  • I/O密集型:就是CPU有一段时间是不工作的,比如socket编程的等待的时候,还有sleep的时候,以及接受数据,发送数据等待
  • 计算密集型:CPU一直在工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值