GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发。它也是 Python 中经常讨论的话题之一。

Python 作为编程语言存在多个具体实现,包括最常用的 CPython、超集 Cython、.NET 平台的 IronPython、JVM 上的 Jython,R 语言实现的 RPython、JIT 版本的 PyPy 等等。这里我们只讨论最常用的、官方的 CPython 实现。

GIL 有什么好处?

简单来说,它在单线程的情况更快,并且在和 C 库结合时更方便,而且不用考虑线程安全问题,这也是早期 Python 最常见的应用场景和优势。

根据官方 wiki,CPython 内存管理不是线程安全的,因此需要 GIL 来保证多个原生线程不会并发执行 Python 字节码。

GIL 的存在一直是富有争议的,它导致 CPython 程序无法真正利用现代操作系统的多进程特性。需要注意的是,对于 I/O 图形处理、NumPy 数学计算这样的耗时操作都发生在 GIL 之外,实际上基本不受影响,真正受影响的都是 CPython 字节码的执行,GIL 会导致性能瓶颈的出现。

Python 采用 GIL 而非管理锁出于以下原因:

  • 单线程情况下更快。
  • 瓶颈在于 I/O 的多线程环境下更快。
  • CPU 耗时操作发生在 C 库调用上时更快。
  • 编写 C 扩展会更容易:除法你手动指定,否则不会发生 Python 线程切换的问题。
  • 封装 C 库变得更容易,因为不需要考虑线程安全问题。如果该库不是线程安全的,你只需要保证调用时 GIL 是锁定的。

GIL 可以被 C 扩展释放,Python 标准库会在每次 I/O 阻塞结束后释放 GIL,因此 GIL 不会对 I/O 服务器产生很大的性能影响。因此你可以 fork 进程或者创建多线程来创建网络服务器处理异步 I/O,GIL 在这种情况下并没有影响。

很多 C 或者 Fortran 编写的数值解析库(numerical libraries)也可以使用类似的方法释放 GIL。在 C 扩展等待 FFT 完成时,解释器可能正在执行其它线程,GIL 在这种情况下相比精良设计的锁解构更简单也更高效。数值解析的部分都是这样的解构,NumPy 扩展会在不需要时及时释放 GIL。

实际上,在很多时候多线程对于服务器程序来说都不是一个好注意。对于低负载程序,fork 多进程更简单更清晰,对于高负载程序,异步 I/O 或者事件驱动更加高效(比如使用 Twisted 框架)。或许,使用多线程的唯一合理解释在于 Windows 上没有 os.fork 。

总之,只有在使用纯 Python 做 CPU 密集运算时 GIL 会是问题。不过你可以使用多进程或者消息传递(比如 mpi4py)来替代,并得到更清晰的架构。 此外,Python 还有 processing 这个库可供选择,它提供了和 threading 相同的接口,(比如你可以使用 processing.Process 来代替 threading.Thread。)

如果没有 GIL 的话,多线程可以提供更迅速的 GUI 反应,如果 GIL 影响了性能(比如上面讨论的情况),你可以创建一个独立进程并等待它结束。

整理自 StackExchange 高票回答 Why Was Python Written with the GIL?

Python Web学习笔记之为什么设计GIL的更多相关文章

  1. Python Web学习笔记之多道程序设计技术和操作系统的特性

    采用了多道程序设计技术的操作系统具有如下特性 : ① 并发性.它 是指两个或两个以上的事件或活动在同一时间间隔内发生.操作系统是一个并发系统,并发性是它的重要特征,操作系统的并发性指计算机系统中同时存 ...

  2. Python Web学习笔记之GIL机制下的鸡肋多线程

    为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程.多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋? 有同学 ...

  3. Python Web学习笔记之多线程编程

    本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...

  4. Python Web学习笔记之TCP/IP、Http、Socket的区别

    经常在笔试.面试或者工作的时候听到这些协议,虽然以前没怎么涉及过,但至少知道这些是和网络编程密不可分的知识,作为一个客户端开发程序员,如果可以懂得网络编程的话,他的作用和能力肯定会提升一个档次.原因很 ...

  5. Python Web学习笔记之WebSocket原理说明

    众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应用可以良好支撑,但对于实时要 ...

  6. Python Web学习笔记之TCP/IP协议原理与介绍

    HTTP.FTP.SMTP.Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从 ...

  7. Python Web学习笔记之SSL,TLS,HTTPS

    一. SSL 1. SSL简介 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可 ...

  8. Python Web学习笔记之Cookie,Session,Token区别

    一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...

  9. Python Web学习笔记之并发编程IO模型

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...

随机推荐

  1. 阿里大于短信返回XML

    返回异常和成功的两种不同,XML返回直接拿alibaba_aliqin_fc_sms_num_send_response判断节点是否有这个名字 官方API地址: https://api.alidayu ...

  2. php面向对象的简单总结 $this $parent self

    面向对象涉及到的比较多,大概总结整理一下php的属性.对象,以及访问方式$this  $parent  self  的使用场景. 1. PHP类属性定义和访问方式: 1 <?php 2 clas ...

  3. PHP pdf转化为图片(PNG)

    /** * 将pdf文件转化为多张png图片 * @param string $pdf pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径) * @param string $p ...

  4. NAS设备是什么

    1.NAS含义: NAS(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机 ...

  5. ios UITableView默认选中第一行

    NSIndexPath *ip = [NSIndexPath indexPathForRow:0inSection:0]; [titleTableViewselectRowAtIndexPath:ip ...

  6. Iterator迭代器的相关问题

    1.使用stl中的  advance和 distance 方法来进行iterator的加减  以前在遍历vector的时候,经常使用iterator之间的加减来获得元素在容器里面的index.  今天 ...

  7. [Android Tips] 31.如何将第三库引入的 Permission 删除掉

    Just declare the incriminated permission in your (main) Manifest with the tools:node="remove&qu ...

  8. HOJ 2139 Spiderman's workout(动态规划)

    Spiderman's workout My Tags (Edit) Source : Nordic Collegiate Programming Contest 2003 Time limit : ...

  9. 徐州网络赛B-BE,GE or NE【记忆化搜索】【博弈论】

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  10. docker环境搭建centos+jdk+tomcat_CENTOS篇

    前言 (1)写在前面的话,鉴于在linux或类unix系统中安装jdk+tomcat等环境,没有什么经验,所以选择在docker容器中安装之,以防止安装失败无法恢复系统 (2)需要下载对应的系统的do ...