美文网首页
Python的GIL

Python的GIL

作者: FangHao | 来源:发表于2017-02-08 23:38 被阅读0次

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都满负载运载

实际运行结果是

即两个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代码)

相关文章

  • GIL

    一,GIL的概念 python全局解释器锁。 二,GIL产生的原因 GIL 并不是 Python 语言的特性,它是...

  • Python day28_GIL 深拷贝浅拷贝

    GIL(全局解释器锁) GIL面试题如下 描述Python GIL的概念, 以及它对python多线程的影响?编写...

  • 线程安全,GIL全局锁

    1. GIL是什么? GIL不是Python特性GIL是实现Python解释器(Cpython)时引入的概念,而C...

  • Python高级语法1:GIL锁&浅拷贝&深拷贝

    一、GIL锁 1.1、GIL面试题:描述Python GIL的概念, 以及它对python多线程的影响?编写一个多...

  • python入门系列:多线程

    python中的GIL GIL(Global Interpreter Lock),就是一个锁。 Python中的一...

  • python中的GIL详解

    原文链接 GIL并不是Python的特性,Python完全可以不依赖于GIL。 ​ GIL 锁: 全局解释器锁,作...

  • python之理解GIL

    python之理解GIL 1、GIL简介 GIL的全称为Global Interpreter Lock,全局解释器...

  • 008 12. python提高-1

    12.1. GIL GIL(全局解释器锁) GIL面试题如下 描述Python GIL的概念, 以及它对pytho...

  • python多线程

    python基础之多线程锁机制 GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析...

  • Python_提高

    GIL全局解释器锁 描述Python GIL的概念, 以及它对python多线程的影响?编写⼀个 多线程抓取⽹⻚的...

网友评论

      本文标题:Python的GIL

      本文链接:https://www.haomeiwen.com/subject/goobittx.html