「python」——一文读懂 GIL

GIL:全局解释器锁

1. python 的解释器分为 CPython(默认解释器)和 JPython,由于历史原因,在 CPython 上难以移除 GIL

2. 每个线程执行是都需要先获取 GIL,保证同一时刻只有一个线程可以执行代码,所以 python 的多线程并不是真正的多线程,不能利用多核的 CPU 资源,但多进程可以利用多核的 CPU 资源。

3. 线程释放 GIL:在 IO 操作等可能会引起阻塞的 system call 之前,可以暂时释放 GIL,但在执行完毕之后,必须重新获取 GIL

4. 多线程并不是鸡肋,存在即合理。例如爬虫时多线程比单线程性能有所提升,因为遇到 IO 阻塞会自动释放 GIL

5. 避免 GIL:在 python 中可以将核心模块通过 c/c++ 实现,通过 python 来调用 c/c++,从而能绕开 GIL,让程序能够高效运行。

使用 C 语言来解决 GIL 问题

把一个c语言文件编译成一个动态库的命令(linux平台下):

gcc xxx.c -shared -o libxxxx.so

用一个 C 语言实现子线程死循环:

void DeadLoop()
{

while(1)
{
;
}
}

python 实现主线程死循环:

from ctypes import *
from threading import Thread

#加载动态库
lib = cdll.LoadLibrary("./libloop.so")

#创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环
t = Thread(target=lib.DeadLoop)
t.start()

#主线程
while True:
pass


分享到:


相關文章: