当前位置:首页 > 科技  > 软件

一文理解Python的全局解释器锁(GIL)

来源: 责编: 时间:2024-04-02 17:18:03 134观看
导读前言• 在Python中,全局解释器锁(Global Interpreter Lock,简称GIL)是一个重要的概念,它对Python解释器的并发执行模型产生了重大影响。本文将介绍GIL的概念、原理以及对Python多线程程序执行效率的影响,并附带详细的代码案

前言

• 在Python中,全局解释器锁(Global Interpreter Lock,简称GIL)是一个重要的概念,它对Python解释器的并发执行模型产生了重大影响。本文将介绍GIL的概念、原理以及对Python多线程程序执行效率的影响,并附带详细的代码案例进行说明。dzG28资讯网——每日最新资讯28at.com

什么是 GILdzG28资讯网——每日最新资讯28at.com

• GIL是Python解释器中的一个互斥锁,它确保在同一时刻只有一个线程能够执行Python字节码。这意味着在多线程环境下,Python解释器无法同时利用多个CPU核心进行并行执行,因为只有一个线程能够执行Python字节码指令。dzG28资讯网——每日最新资讯28at.com

GIL 的工作原理

• 当Python解释器运行Python代码时,它会获取GIL,然后执行相应的字节码指令。其他线程想要执行Python字节码时,必须先获取GIL,但只有在当前线程释放GIL后才能获得。因此,只有一个线程能够在任意时刻执行Python字节码,这就是GIL的工作原理。dzG28资讯网——每日最新资讯28at.com

GIL 的影响

多线程

• 尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。 GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。dzG28资讯网——每日最新资讯28at.com

• 有一点要强调的是GIL只会影响到那些严重依赖CPU的程序(比如计算型的)。 如果你的程序大部分只会涉及到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。dzG28资讯网——每日最新资讯28at.com

• 对于依赖CPU的程序,你需要弄清楚执行的计算的特点。 例如,优化底层算法可能要比使用多线程运行快得多。 类似的,由于Python是解释执行的,如果你将那些性能瓶颈代码移到一个C语言扩展模块中, 速度也会提升的很快。如果你要操作数组,那么使用NumPy这样的扩展会非常的高效。 最后,你还可以考虑下其他可选实现方案,比如PyPy,它通过一个JIT编译器来优化执行效率。dzG28资讯网——每日最新资讯28at.com

多进程

• 在 Python 中,GIL(全局解释器锁)只影响到了多线程,而不会对多进程产生直接的影响。多进程是通过创建不同的 Python 解释器来实现的,因此每个进程都有自己的独立 GIL,它们之间互不影响。dzG28资讯网——每日最新资讯28at.com

如何解决 GIL 的缺点

示例代码

• 代码版本 Python 3.xdzG28资讯网——每日最新资讯28at.com

• 如我们如何优化下列代码:dzG28资讯网——每日最新资讯28at.com

# Performs a large calculation (CPU bound)def some_work(args):    ...    return result# A thread that calls the above functiondef some_thread():    while True:        ...        r = some_work(args)    ...

使用多进程的方式

• 如果你完全工作于Python环境中,你可以使用 multiprocessing 模块来创建一个进程池, 并像协同处理器一样的使用它,每个进程有独立的 GIL。dzG28资讯网——每日最新资讯28at.com

# Processing pool (see below for initiazation)pool = None# Performs a large calculation (CPU bound)def some_work(args):    ...    return result# A thread that calls the above functiondef some_thread():    while True:        ...        r = pool.apply(some_work, (args))        ...# Initiaze the poolif __name__ == '__main__':    import multiprocessing    pool = multiprocessing.Pool()

使用C扩展编程技术

• 主要思想是将计算密集型任务转移给C,跟Python独立,在工作的时候在C代码中释放GIL。 可以通过在C代码中插入下面这样的特殊宏来完成:dzG28资讯网——每日最新资讯28at.com

#include "Python.h"...PyObject *pyfunc(PyObject *self, PyObject *args) {   ...   Py_BEGIN_ALLOW_THREADS   // Threaded C code   ...   Py_END_ALLOW_THREADS   ...}

• 如果使用其他工具访问C语言,比如对于Cython的ctypes库,你不需要做任何事。 例如,ctypes在调用C时会自动释放GIL。dzG28资讯网——每日最新资讯28at.com

参考

• 12.9 Python的全局锁问题dzG28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80834-0.html一文理解Python的全局解释器锁(GIL)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 并发协调神器CountDownLatch和CyclicBarrier

下一篇: C++ 八种常见类类型

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起“冯提莫”这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的“斗鱼一姐”,冯提莫在游戏直播的年代影响力不输于现
  • 华为开发者大会2023日程公开:开设鸿蒙HarmonyOS 4体验区

    IT之家 7 月 31 日消息,华为今日公布了 HDC.Together 开发者大会 2023 的详细日程。整场大会将于 8 月 4 日-6 日之间举行,届时将发布最新一代鸿蒙 H
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top