python的GIL全局解释器锁

374 阅读2分钟

在说GIL之前先了解一下,并行和并发的区别

在进行GIL讲解之前,我们可以先回顾一下并行和并发的区别:
并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。
并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。

什么是GIL?

即全局解释器所(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。

划重点!!!

它的作用是:

保证同一时刻只有一个线程能使用到cpu

GIL产生的原因:

  1. Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu。
  2. 解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁。
  3. cpython解析只允许拥有GIL全局解析器锁才能运行程序。
  4. 保证同一个时刻只允许一个线程可以使用cpu。
  5. 以前写cpython解析器的时候就考虑一个cpu情况。
  6. 由于大量的程序开发者接收了这套机制,现在代码量越来越多,已经不容易通过c代码去解决这个问题。

解决方案:

  1. 更换cpython为jpython(不建议)。
  2. 使用多进程完成多线程的任务。
  3. 在使用多线程可以使用c语言去实现。