Python中的GIL锁与解决办法

探讨Python中GIL锁的概念,分析其如何限制多线程在计算密集型任务中的效率,以及如何通过多进程、更换解释器或使用C语言编写的函数来绕过GIL,充分利用多核CPU资源。

GIL锁:全局解释器锁。每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。

现象:开启多线程无法真正利用多核CPU,如两个线程死循环,两核CPU各为50%利用率。而两个进程死循环,两核CPU利用率都为100%。此时在计算密集型操作时,多线程如同单线程。但在IO密集型操作时,多线程可以利用IO等待时间。

python使用多进程可以利用多核的CPU资源,多线程却无法利用多核的CPU资源。

原因:由于历史原因在Cpython虚拟机(解释器)难以移除GIL。

解决办法

  1. 换解释器,避免用c语言写的解释器。
  2. 用其他语言替代线程中所做的事。
  • 用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

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值