GIL锁:全局解释器锁。每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
现象:开启多线程无法真正利用多核CPU,如两个线程死循环,两核CPU各为50%利用率。而两个进程死循环,两核CPU利用率都为100%。此时在计算密集型操作时,多线程如同单线程。但在IO密集型操作时,多线程可以利用IO等待时间。
python使用多进程可以利用多核的CPU资源,多线程却无法利用多核的CPU资源。
原因:由于历史原因在Cpython虚拟机(解释器)难以移除GIL。
解决办法:
- 换解释器,避免用c语言写的解释器。
- 用其他语言替代线程中所做的事。
- 用c语言写线程中的函数:
void DeadLoop()
{
while(1)
{
;
}
}
- 把c语言文件编译成一个动态库的命令(Linux平台):
gcc xxx.c -shared -o libxxx.so
- 在python中加载动态库并让子线程执行c语言编写的函数
from ctypes import *
from threading import Thread
# 加载动态库
lib = cdll.LoadLibrary("./libdead_loop.so")
# 创建一个子线程,让其执行c语言编写的函数,此函数是一个循环
t = Thread(target=lib.DeadLoop)
t.start()
# 主线程
while True:
pass