Python的GIL

Python的GIL是什么#

GIL即全局解释器锁(Global Interpreter Lock)

首先我认为,Python本身语言不存在对于线程的缺陷,但是由于Python代码不像C语言一样经过编译后直接可以操作CPU,需要经过一层解释器解释后才能让CPU认识使用。 由C语言编写的Cpython解释器,对于代码中存在多个线程的程序时有限制,及解释器只会在同一段时间处理一个线程的工作,也就是说交给CPU的任务也就是一个线程的工作。这个问题是由于当时在设计Python的时候由于CPU还都是单核,并没有现在多核的CPU,所以为了提高线程的执行效率和CPU的使用率,就会采用解释器一段时间只能执行一个线程的结果。当然并不是Python作者不去解决这个问题,而且修改GIL会带来数据安全之类的问题:)

具体实验如下:

1)在双核CPU、主线程死循环的情况下

#coding=utf-8
while True:
pass

一个CPU是满负荷运载的

2)在双核CPU、主线程和子线程是死循环的情况下

#coding=utf-8
from threading import Thread

def test():
while True:
pass

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

test()

我们预想一下,此种情况由于有两个死循环线程,所以应该是两个CPU都满负载运载

实际运行结果是

Python的GIL_第1张图片

即两个CPU的运行效率基本在50%,所以我们可以理解为,两个线程任务都不是满负载运作。这就是Python的GIL限制

解决方案#

1)首先GIL出现在的是Cpython解释器中的,而Jpython解释器中并没有,所以说换解释器也可以作为一种解决方案。但是这种方案有点太low,说不定对项目还有其他的影响。

2)使用进程的方式来解决。首先Python的GIL问题是存在在线程中的,对于进程并没有这种限制,我们可以做以下实验

#coding=utf-8
from multiprocessing import Process

def test():
while True:
pass

p1 = Process(target = test)
p1.start()

test()

两个死循环进程的运行结果是:

所以说采用进程也是一种解决方案

3)但是过多的进程,其实吃的资源也非常多,个人认为最佳的解决方案是将多线程执行的部分,换用C语言重写,编译完成后Python直接引入,所以说线程的工作不需要解释器来工作,就可以极大地提高性能(当然目前我不会写C代码)

你可能感兴趣的:(Python的GIL)