GIL(全局解释器锁)

1.什么是GIL?

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

2.解决GIL问题

在执行代码是调用其他语言

  1. 编写 loop.c 文件
    void DeadLoop()
    {
        while(1)
        {
            ;
        }
    }
    
  2. 制作 .so 文件
    在Linux终端执行,会生成一个 .so 动态库文件
    gcc -shared -o libdead_loop.so loop.c
    
  3. 编写 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代码编写简化到了类似多线程的程度了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值