GIL(全局解释器锁)
1.什么是GIL?
GIT:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
2.解决GIL问题
在执行代码是调用其他语言
- 编写 loop.c 文件
void DeadLoop() { while(1) { ; } }
- 制作 .so 文件
在Linux终端执行,会生成一个 .so 动态库文件gcc -shared -o libdead_loop.so loop.c
- 编写 main.py 文件导入 .so 文件
from ctypes import * from threading import Thread # 加载动态库 lib = cdll.LoadLibrary("./libdead_loop.so") # 创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环 t = Thread(target=lib.DeadLoop) t.start() # 主线程 while True: pass
3.为什么有了GIL,还需要互斥锁?
在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全copy局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。
所以,虽然CPython的线程知库直接封装了系统的原生线程,但CPython整体道作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。
不过muiltprocessing的出现,已经可以让多进程的python代码编写简化到了类似多线程的程度了