全局解释锁-GIL

原创 2018年04月16日 20:57:29

这几天试了好几种爬虫模式,从单进程到多线程,又试了多进程以及插入协程,纠结于效率问题又了解到GIL,粗浅总结一下不同场景下的多任务模式的选择


先说结论:python多线程鸡肋,多进程好比分布式,协程好比异步IO。


一,GIL及其由来

GIL全称Global Interpreter Lock
官方文档
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.

可以看出:GIL并不是Python的特性,而是CPython解释器,Python完全可以不依赖于GIL,目前很多默认python环境就是CPython的,GIL的存在更多的是历史原因。

二,作用机制

Python的线程虽然是真正的线程,但解释器执行代码时,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码(龟叔开发python的时候只有单核,为了让各个线程能够平均利用CPU时间,python会计算当前已执行的微代码数量),解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行。

再者,我们都知道线程是共享全局变量的,解决多线程之间数据完整性和状态同步的最简单方法自然也是加锁,那么多锁很容易造成死锁,导致多个线程全部挂起,既不能执行,也无法结束,只能靠操作系统强制终止。

三,python实现多任务

在Python中可以使用多线程,I/O密集情况下,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行,这个情况下的多线程还是比单线程有所提高的。但不要指望能有效利用多核,多线程的并发在Python中就是一个dream。

若一定要通过多线程利用多核,在计算密集型下,可以通过C扩展来实现(重写一个不带GIL的解释器不太现实),可以把一些 计算密集型任务用C语言编写,生成动态库,然后把.so链接库内容加载到Python中,因为执行C代码,GIL锁会释放,这样一来,就可以做到每个核都跑一个线程的目的;最普遍就是通过多进程实现多核任务(代码获取核心数multiprocessing.cpu_count( ) ),每个进程都有单独的内存空间,GIL只对同一空间内线程起作用,这样还可以防止死锁发生。

单核用多线程的话,如果多任务一旦多到一个限度,除了GIL,系统也会把大量时间用在切换上,效率也是急剧下降的。我跟着代码跑了两次,计算密集情况下,发现单线程比多线程效率高了将近20%,

多进程在计算任务多但是不大情况下,进程因为创建和调度进程带来的开销要远超出它的正面效应,多线程也需要缓存等等,这个时候就要用到单线程的异步编程模型,也是协程(python的天生优良基因),协程只是单纯的操作CPU的上下文,会大大提高效率。


更多请参考大牛CENALULU’S TECH BLOG

版权声明: https://blog.csdn.net/kiKimonster/article/details/79959195

对于python全局性解释锁(GIL)的一些理解

转载:http://www.chenqing.org/2013/06/python-gil-1.html 像C++这样的语言是编译型语言,所谓编译型语言,是指程序输入到编译器,编译器再根...
  • yugongpeng_blog
  • yugongpeng_blog
  • 2015-06-23 16:42:08
  • 1952

【python】关于python的全局解释锁GIL及线程问题

在讲全局解释锁之前,我们需要先明白 线程 进程的概念。 在进程中有一个或者多个线程。每个进程具有自己的地址空间,内存,数据栈及其它数据。线程有开始、顺序执行和结束部分。线程是cpu调动的,没有自己的...
  • u012735879
  • u012735879
  • 2016-09-21 03:43:46
  • 1109

理解python GIL 全局锁

众所周知,python中有全局解释器锁,由于全局解释器锁的存在,所以在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。在python,使用的都是操作系统级别...
  • tuxl_c_s_d_n
  • tuxl_c_s_d_n
  • 2015-05-08 23:22:42
  • 2728

Python高级特性:全局解释器锁GIL基本概念

本文主要介绍全局解释器锁(Global Interceptor Lock)GIL的基础知识,涉及基本概念,工作原理,对多线程性能影响等。...
  • u010096900
  • u010096900
  • 2015-05-01 22:49:16
  • 3891

python GIL 全局锁

本文转载自:http://cenalulu.github.io/python/gil-in-python/ 本文对其中的部分代码与测试结果进行了修改校准。GIL是什么首先需要明确的一点是GIL并不是...
  • bitcarmanlee
  • bitcarmanlee
  • 2016-06-03 10:32:03
  • 6353

Python的全局锁(GIL)问题

CPU-bound(计算密集型) 和I/O bound(I/O密集型)计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态。比如复杂的加...
  • xsj_blog
  • xsj_blog
  • 2017-04-23 19:57:00
  • 1506

初识全局解释器锁(GIL)

**GIL概念英文全称:Global Interceptor Lock中文解释:全局解释器锁用途:Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Pytho...
  • u011617097
  • u011617097
  • 2015-11-28 22:53:29
  • 468

python全局解释器锁(GIL)

Python的GIL是什么鬼,多线程性能究竟如何 前言:博主在刚接触Python的时候时常听到GIL这个词,并且发现这个词经常和Python无法高效的实现多线程划上等号。本着不光要知...
  • tgxallen
  • tgxallen
  • 2017-02-06 12:31:08
  • 569

Python 中的 GIL(Global Interpreter Lock) 全局解释器锁是什么?

文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/python/gil-in-pytho...
  • HeatDeath
  • HeatDeath
  • 2017-06-02 11:03:20
  • 1081

Python3之GIL全局解释器锁

GIL全局解释器锁:     同一进程下的多线程共享数据,共享意味着竞争,竞争带来无序,为了数据安全所以需要加锁进行数据保护,GIL本质是一把互斥锁,使并发变为串行,保证同一时间只有一条...
  • qq_33733970
  • qq_33733970
  • 2017-09-15 10:18:22
  • 868
收藏助手
不良信息举报
您举报文章:全局解释锁-GIL
举报原因:
原因补充:

(最多只允许输入30个字)