计算密集型 :主要进行大量的计算,占据着主要的任务,消耗cpu资源,一直处于满负荷状态
IO密集型:指磁盘IO、网络IO占主要的任务,CPU消耗很少,任务的大部分时间都在等待IO操作完成。

IO的速度远远低于CPU和内存的速度

定义

GIL(Global innterpreter Lock)每个线程在执行的过程中都需要先获取GIL,保证在同一时刻只有一个线程可以执行代码 在多线程的环境下,python虚拟机按照下面的方式执行

  1. 设置GIL
  2. 切换到一个线程去运行
  3. 运行:
  4. a. 指定数量的字节码指令,或者
  5. b. 线程主动让出控制(可以调用time.sleep(0))
  6. 把线程设置为睡眠状态
  7. 解锁GIL
  8. 再次重复以上所有步骤

为什么使用锁?

锁的机制:保证在对一个变量进行相关操作的时候,同一时刻只有ig线程在执行。只有拿到锁的线程,才能对变量进行相关的操作。
锁从语言上区分:
细粒度的锁:在代码上主动加的锁
粗粒度的锁:在整个python的解释器(cpython)的层面上加的锁
加锁粒度就是你要锁住大的范围的大小

粗粒度的解释器的锁就是GIL,多核cpu,同时只能执行一个线程,由于每个线程在多个CPU上的交替执行的,导致在不同CPU上切换时造成资源的浪费。在一定程度上保证线程的安全

线程释放GIL锁的情况

1.在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL
2.Python 3.x使用计时器,执行时间到达阈值后,当前线程释放GIL, Python2.x,tickets计数达到100

解决方案

1.使用其他语言,C,java
2.使用其他解释器
3.使用多进程 GIL的存在,在IO密集型的场景下使用多进程会得到较好的性能