jpython解释器_粗略说一下cpython解释器中的GIL锁

今天在用cpython解释器写多线程的时候发现一些有趣的现象,我们先来看一下这些现象:

运行代码:

while True:

pass

然后我们打开任务管理器,可以看到一个主线程可以直接把一个cpu占满:只有一个主线程进行死循环便可以占满一个cpu

接下来是一个主线程加上一个子线程:

运行代码:

import threading

#子线程死循环

def test():

while True:

pass

t1 = threading.Thread(target=test)

t1.start()

#主线程死循环

while True:

pass

这个时候的现象是:明明有两个线程在运行,可是这两个线程的cpu占有率加起来才达到了100%

有学习过其他编程语言的朋友一定会知道,在其他语言中多线程中只要线程数达到了cpu核数那么是可以直接占满cpu的,那么在cpython中为什么会有这种现象呢?因为在python的创始人Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu的情况,当时想让一个cpu做不同的事情那么就只能加锁,在cpython线程运行前首先获得这把全局解释锁(GIL)。事实上在cpython中,多核cpu运行多线程的时候,同一时间(同一时间片内)只允许一个核运行多线程中的一个线程。那么有人可能要问了,那为什么上面的这幅图显示两个核心加起来是100%呢?其实,真实的情况是只有一个核在运行,并且这个核的使用率只达到了它的一半左右,intel公司在开发多核cpu时加入了一些内部机制使的多核心可以交替运行。

简单的理解就是:多线程会去抢占多核cpu中总共加起来100%的cpu使用率,同一时间只能有一个线程在其中的一个核中运行。

CPython解释器中的GIL锁确实是一个历史遗留问题,但是我们也是有办法可以规避的,下面给出3种方案可以解决这个问题:更换cpython为jpython(不建议)

使用多进程完成多线程的任务(资源占用会多一些)

在使用多线程可以使用c语言去实现(python胶水语言的特性

总结一下:GIL是全局解析器锁,保证在同一时刻只有一个线程可以使用cpu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值