python GIL(全局解释器锁)

python  C 解释器有一个叫GIL 的东西作用:

每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。

所以在python中,如果对于CPU密集型任务,多线程是没有用的,因为一个线程不会释放GIL;但是对于IO密集型任务,多线程还是能提高效率,因为在IO阻塞的情况下,会自动释放GIL锁。

为什么不移除GIL

Guido的声明:http://www.artima.com/forums/flat.jsp?forum=106&thread=214235

 

所以对于python GIL 的问题解决方案有几种

  1. 不用C解释器,用JAVA解释器
  2. 用多进程
  3. 调用C代码

为什么调用C代码能够解决GIL 问题?

个人理解,gcc 编译的c语言执行文件或者动态库,已经是二进制文件,二进制文件可以直接被机器识别,直接调用,不走C解释器,也就不存在GIL这一说了。

测试GIL 问题

测试代码链接: 测试代码

单线程测试

while True :
    pass

表现:基本占满1个核

 

2个线程测试

import threading


def test():
    while True:
        pass

#子线程
threading.Thread(target=test).start()
#主线程
while True:
    pass

 

表现:仍然只占满一个核

2个进程测试

import multiprocessing

def test():
    while True:
        pass
#子进程
multiprocessing.Process(target=test).start()

#主进程
while True:
    pass

表现 :占满了2个核

通过C语言来实现

C代码
//动态库编译
//gcc deadloop.c -shared -o libloop.so

void  test(){
    while(1);

}
==================================
python 中调用

from ctypes import cdll
from threading import  Thread


lib = cdll.LoadLibrary("./libloop.so")

Thread(target=lib.test).start()

while True:
    pass
============================

表现:占满2个核

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值