GIL锁
一、GIL的简单概述
1.概念
GIL ( Global Interperter Lock ) 称作 全局解释器锁
2.特性
GIL 只在 CPython 解释器中存在
线程互斥锁是 Python 代码层面的锁
GIL 是 Python 解释器层面的锁
互斥锁和 GIL 锁都是用来解决多个线程中的共享变量的竞争资源问题。
二、GIL对于多线程的影响
1.程序分类
计算密集型 :
计算密集型任务的特点是要进行大量的计算,消耗CPU资源. 例如 : 复杂的加减乘除, 让CPU处于满负荷的状态
IO密集型 :
IO密集型任务涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成 例如 : 硬盘的操作
2.GIL锁的释放条件
多线程的程序中 : 由于 GIL 的存在,Python 同一时刻只有一个线程在执行, 无法有效利用多核 CPU
1. 时间片结束
2. 程序遇到IO等待
3. 解释器执行字节码到达一定的数量,默认是100条
3.GIL对于计算密集型与IO密集型的影响
计算密集型 :
计算密集型任务,同一时刻,由于只有一个CPU对其进行操作, 从而使多线程程序有且只有一个线程可以执行,程序执行效率降低
IO密集型 :
IO密集型任务,GIL遇到IO操作就释放锁, 这样可以有效的利用多核优势, 进而让效率会稍有提高,
三、解决GIL对于多线程影响的方案
1.使用多线程 + 协程实现多任务
使用多进程的原因 :
多进程下的子进程会复制主进程环境,使每一个进程中都有一个GIL锁,就不会出现进程中该线程抢锁的情况。
使用协程的原因 :
协程本身就是在一个线程中切换执行,所以不会受到锁的影响