Python的 GIL 锁 和 多核CPU 之间的关系

什么是GIL

GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)

python多线程下,每个线程的执行方式:
  1. 获取GIL
  2. 执行代码直到sleep或者是python虚拟机将其挂起。
  3. 释放GIL

可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。
在Python2.x里,GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100(ticks可以看作是Python自身的一个计数器,专门做用于GIL,每次释放后归零,这个计数可以通过sys.setcheckinterval来调整),进行释放。而每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行)。

多核CPU 跟 GIL 的冲突

众所周知,多核CPU可以实现并行的功能

那么问题来了, 在多核CPU下, 因为python的GIL,岂不是成为单线程了?

答案: 是这样的
一个进程内的线程想要进入CPU执行, 必须先要拿到 GIL , 但是, 同一时间只能有一个线程可以拿到, GIL 的释放逻辑 是 tacks 计数到达 100 或遇到 IO操作 进行释放
在单进程的 多线程下, 即使是 多核 CPU , 在 python里 仍然是 单线程(因为有 GIL)
单进程的 GIL 会影响 python 的 开发效率

如何解决?
答案: , 可以通过多进程的方式来解决这种情况, 因为 GIL 针对于 某个进程的 多线程, 开启多个进程解决 GIL 带来的影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值