分享

Python全局解释器锁(GIL)

 网摘文苑 2023-05-18 发布于新疆

原因1:

  • 动态类型语言:

  • Python的变量既可以是数字,也可以随时切换成字符串,导致运行时随时检测类型

  • 边解释边执行:

  • C语言直接编译成机器码,直接运行非常快,而Python执行就是源码,存在一个源码到机器码的翻译过程


原因2:

  • GIL: 它的存在,使Python无法利用多核CPU并发执行

  • GIL是什么?

    全局解释器锁〔英语:Global Interpreter Lock,缩写GIL)

    是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。

    即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行一个线程。

    下图就是一个例子:

    三个线程Thread1、2、3,哪个线程持有GIL,该线程才在执行,当遇到I/O时,就会释放GIL,I/O是指读写操作、发送网络等等

    Thread1持有GIL,遇到I/O,释放GIL,这时Thread2才能开始进入运行状态

    文章图片1

    由于GIL的存在,即使电脑有多核CPU单个时刻也只能使用1个,相比并发加速的C++/JAVA所以慢。

    单个时刻单个进程只能使用1个线程,但多进程下就可以有。

    总结:(Python是一门伪多线程语言)

    为什么有GIL这个东西

    GIL存在目的:为了解决多线程之间数据完整性和状态同步问题

    GIL存在原因:Python中对象的管理,是使用引用计数器进行的,引用数为0则释放对象(涉及到Python的垃圾回收)

    举例:开始:线程A和线程B都引用了对象obj,obj.ref_num 2,线程A和B都想撤销对obj的引用

    若其中发生多线程调度切换,进行了两次对象释放,其导致的结果:发生报错,可能错释放别的内存,破坏内存。

    文章图片2

    GIL的引入就是解决以上类似的问题:简化了Python对共享资源的管理。

    怎样规避GIL带来的限制

    1、多线程threading用于IO密集型计算,不用于CPU密集型计算

    因为在I/O (read,write,send,recv,etc.)期间,线程会释放GIL,实现CPU和IO的并行因此多线程用于IO密集型计算依然可以大幅提升速度

    用于CPU密集型计算时,只会更加拖慢速度(只有一个cpu在运行,且多线程切换会增加开销)

    2、使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势

    为了应对GIL的问题,Python提供了multiprocessing

    更多学习

    更多关于python自动化、测试开发、高级性能测试、java学习资料可以留言咨询。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多