GIL问题

GIL 是什么?

全局解释器锁,GIL本质上就是一把互斥锁,将并发运行变成串行,只有一个线程控制Python解释器,这意味着在任意时间只能有一个线程处于执行状态,即便是处于多线程以及多核CPU的架构中,也是如此。

它并不是Python的特性,而是在实现python的主流Cpython解释器时所引入的一个概念,GIL加锁处理,以此来控制同一时间内共享数据只能被一个任务所修改,从而保证数据的安全性。

PS:每次执行python程序,都会产生一个独立的进程,进程里除了能看到的若干线程,还有看不见的解释器开启的垃圾回收等解释器级别的线程。

GIL解决了什么问题?

所有数据都是共享的,这其中,代码作为一种数据也是被所有线程共享的(test.py的所有代码以及cPython解释器的所有代码)

例如:test.py定义一个函数work(代码内容如下图),在进程内所有线程都能访问到work的代码,于是我们可以开启四个线程然后target都指向该代码,能访问到意味着就是可以执行。

所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行,即所有的线程要想运行自己的任务,首先需要解决的是能够访问到解释器的代码。

GIL保护的是解释器级别的数据,但是用户自己的数据需要自己加锁处理。

由于Python使用GC算法是引用计数,引用计数算法的优点在于简单,实时性高,避免集中回收时回收对象过多造成的瞬时无法响应,

但是引用计数的问题

什么时候会用到GIL?

GIL的缺点是什么?

那为什么cPython还保留了GIL(优点)?

其他语言为什么没有GIL的问题?

Python的cPython、Ruby的MRI这两个实现都有GIL的问题,Java没有

为什么多线程不可以跑满CPU而多进程可以跑满?

如何解决GIL的问题?

  1. 通过使用多进程避免GIL的问题
  2. 关键函数使用C,然后编译并通过Python载入C程序,调用其内部的函数,实现真正的多线程执行

脑图

results matching ""

    No results matching ""