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的问题?
- 通过使用多进程避免GIL的问题
- 关键函数使用C,然后编译并通过Python载入C程序,调用其内部的函数,实现真正的多线程执行