iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python编程中Python与GIL互斥锁关系作用分析
  • 438
分享到

Python编程中Python与GIL互斥锁关系作用分析

2024-04-02 19:04:59 438人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

我们知道,在 Cpython 中,有一个全局解释器锁,英文叫 global interpreter lock,简称 GIL,是一个互斥锁,用来保护 Python 世界里的对象,防止同

我们知道,在 Cpython 中,有一个全局解释器,英文叫 global interpreter lock,简称 GIL,是一个互斥锁,用来保护 Python 世界里的对象,防止同一时刻多个线程执行 Python 的字节码,从而确保线程安全,这导致了 Python 的线程无法利用多核 CPU 的优势,因此有人说 Python 的多线程是伪多线程,性能不高,那么 Python 将来有可能去除 GIL 吗?

要回答这个问题,先从 GIL 的起源进行分析。

GIL 的起源

Python 第一次发布是在 1991 年,当时的 CPU 都是单核,单核中,多线程主要为了一边做io,一边做 CPU 计算而设计的,Python 编译器是由 C 语言编写的,因此也叫 CPython,那时候很多编程语言没有自动内存管理的功能,为了实现自动垃圾回收,Python 为每一个对象进行了引用计数,当引用计数为 0 的时候说明该对象可以回收,从而释放内存了,比如:


>>> import sys
>>> data = { 'gzh': 'Python七号'}
>>> var1 = data
>>> sys.getrefcount(data)
3
>>> 

这里 data 对象就有 3 个引用, 一个是本身,一个是变量 var1,一个是 getrefcount 函数的参数,如果此时又有一个线程引用了 data,那么引用计数再增加 1,如果某个线程使用了 data 后运行结束,那么引用计数就减少 1,多线程对同一个变量「引用计数」进行修改,就会遇到 race conditions(竞争),为了避免 race conditions,最简单有效的办法就是加一个互斥锁。

如果对每一个对象都加锁,有可能引发另一个问题,就是死锁,而且频繁的获取和释放会导致性能下降,最简单有效的方法就是加一个解释器锁,线程在执行任何字节码时都先获取解释器锁,这就避免了死锁,而且不会有太多的性能消耗。当时 CPU 都是单核,而且这种 GIL 设计简单,并不会影响性能,因此一直沿用至今天。GIL 存在最主要的原因,就是因为 Python 的内存管理不是线程安全的,这就是 GIL 产生并存在的主要缘由。

尝试消除 GIL

CPU 进入多核时代后,可以同时做多个计算任务, GIL 才真正变成问题。在 1999 年,有个叫 Greg Stein 的大佬基于 Python 1.5 版本消除了 GIL,取代代之的是在可变数据结构上加上更细粒度的锁,也提交了补丁用于去除对全局可变对象的依赖,然后在标准测试时表明去除 GIL 后单线程比不去除时慢了近 2 倍,测试的机器还是当时性能最好 windows 机器。也就是说除去了 GIL 后,你使用 2 个 CPU 才能获取比原来 1 个 CPU 稍微好一点的性能,这种提升明显得不偿失,Greg Stein 的尝试也就失败告终。

Python 之父 Guido van Rossum 也欢迎社区的志愿者去尝试去除 GIL,只要不降低单线程的性能,但他也提到,去掉 GIL 不是一件容易的事。

Python 开发者邮件列表中也偶尔会有去除 GIL 的议题,但是以下需求必须满足:

  • 简单。从长远来看该方案必须是可实施、可维护的。
  • 并发。去除 GIL 必须能提升多线程的性能。
  • 速度。去除 GIL 不能降低单线程的性能。
  • 满足 CPython 的特性。该方案必须支持 CPython 的功能,比如 __del__ 和弱引用。
  • api 的兼容性。该方案应与所有现有CPython扩展使用的宏在源方面兼容。
  • 及时销毁不可达对象,回收内存。
  • 有序销毁,比如不可达对象 X 引用了 A,那么应该在销毁 A 之前先销毁 X(有些垃圾回收算法并不能做到这一点)。

有些需求不容易被满足,比如 4,5,7,目前,还没有人满足以上需求的同时去除 GIL 成功的。

积重难返

这些年 Python 实在太火了,很多优秀的库都是基于 CPython 进行编写的,很多都是 90 年代的 C 扩展库,如果要除去 GIL,那么很多基于 GIL 编写的 C 扩展便无法使用,也就是去了 GIL,Python 生态有很多扩展或三方库者无法使用。

还有一个很明显的例子,Python 解释器不止有 CPython,还有用 Java 编写的 Python,.net 实现的 IronPython,这些解释器完全没有 GIL,可是有多少人为它们编写扩展呢?

Python 之所以如此火爆,与它有着丰富的三方库开箱即用有着很大的关系,积重难返,去除 GIL 很困难。

为什么 python3 一开始时不去除 GIL

Python3 在最开始时是有机会实现很多新功能,在此过程中,打破了一些现有的 C 扩展,然后需要更新和移植更改以配合 Python 3,这也是 Python3 一开始不被社区所接受的原因。

与 Python2 相比,删除 GIL 将使 Python3 在单线程性能方面更慢,而且很多优秀的扩展将不能再使用,如果真的这样,可以想象 Python3 不可能有未来,最终的结果是 Python3 仍然保持有 GIL。

但 Python3 也为现有的 GIL 带来了重大改进,在 Python 3.2 版本中,确保了计算密集型线程和 I/O 密集型线程并存时, I/O 密集型长期获取不到 GIL 而无法执行的问题,提升了多线程的性能。

最后的话

Python 因为内存管理不是线程安全的,因此自出生起就自带 GIL,然后很多扩展都是在 GIL 的保护下编写的,时间一长积重难反,Python3 一开始也因去除 GIL 导致单线程性能下降的问题而保留 GIL,现在已经是 Python3.9 版本了,将来 Python 去除 GIL 的可能性微乎其微,换句话说,去除 GIL 的 Python 也就不是我们认识的 Python 了。

不过不必沮丧,GIL 影响的也仅仅是多线程执行计算密集型的任务罢了,这种场景大多数程序员都很少遇到,即使有,可以使用多进程来避免 GIL 的影响,或者使用其他编程语言实现,任何编程语言或技术都不是十全十美的,发挥所长是最重要的,即使有 GIL,我也不在乎,也会依然使用 Python。

以上就是Python与GIL互斥锁关系分析的详细内容,更多关于Python与GIL互斥锁的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python编程中Python与GIL互斥锁关系作用分析

本文链接: https://www.lsjlt.com/news/135687.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python编程中Python与GIL互斥锁关系作用分析
    我们知道,在 CPython 中,有一个全局解释器锁,英文叫 global interpreter lock,简称 GIL,是一个互斥锁,用来保护 Python 世界里的对象,防止同...
    99+
    2024-04-02
  • python多线程中互斥锁与死锁的示例分析
    小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、多线程间的资源竞争以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(...
    99+
    2023-06-29
  • 怎么在python中利用互斥锁分配资源
    本篇文章为大家展示了怎么在python中利用互斥锁分配资源,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • C语言中互斥锁与自旋锁及原子操作使用浅析
    目录互斥锁自旋锁原子操作实操结果互斥锁 临界区资源已经被1个线程占用,另一个线程过来访问临界资源的时候,会被CPU切换线程,不让运行后来的这个线程 适用于 锁住的内容多,(例如红黑数...
    99+
    2023-01-11
    C语言互斥锁 C语言自旋锁 C语言原子操作
  • Python编程中框架与异步编程的密切关系。
    Python编程中框架与异步编程的密切关系 Python是一种高级编程语言,被广泛应用于各种领域,如Web开发、数据分析、人工智能等。Python编程中框架和异步编程是两个重要的概念,它们在Python编程中的应用非常广泛,本文将介绍它们之...
    99+
    2023-06-18
    编程算法 框架 异步编程
  • Python 中的并发编程难题:与死锁和竞态条件作战
    死锁 死锁是指多个线程相互等待资源,从而形成一个循环,最终导致所有线程都阻塞。在 Python 中,死锁通常发生在对多个锁或互斥量按错误顺序进行锁定时。 示例: import threading # 两个线程共享两个锁 lock1 =...
    99+
    2024-02-18
    Python 并发编程 死锁 竞态条件 信号量 事件
  • Python编程中*args与**kwargs区别作用详解
    相信学Python的小伙伴肯定有这样的尴尬局面,给一个函数不会用, 原因是:不知道参数列表中的类型是什么意思,比如初学者都会疑问的:*args和**kwargs到底是怎么用。 当你知...
    99+
    2024-04-02
  • Python中的数组操作与Unix系统编程如何结合?
    Python是一种高级编程语言,常用于数据分析、人工智能、Web开发等领域。而Unix系统编程则是一种基于Unix/Linux操作系统的编程方法,主要用于系统级编程、网络编程等领域。本文将介绍如何将Python中的数组操作与Unix系统编...
    99+
    2023-09-16
    unix http 数组
  • Python中的作用域与名字空间实例分析
    这篇文章主要介绍“Python中的作用域与名字空间实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的作用域与名字空间实例分析”文章能帮助大家解决问题。变量只是一个符号从解释器的角...
    99+
    2023-07-05
  • 编程新手必备:Python 编程语言中的常用关键字解析
    Python 是一种高级编程语言,它拥有简单易学、易读易写、功能强大、可扩展等优点,因此它成为了编程新手入门的首选语言。在 Python 中,有许多常用的关键字,我们必须熟悉它们的含义和用法,才能更好地理解代码和编写程序。下面,我们就来一起...
    99+
    2023-06-28
    关键字 编程算法 文件
  • 如何在分布式系统中运用 Python 编程?
    分布式系统是现代计算机系统中的重要组成部分,可以用于数据处理、分析、存储等多种应用场景。Python 作为一门简单易学且功能强大的编程语言,可以在分布式系统中发挥重要的作用。在本文中,我们将介绍如何在分布式系统中运用 Python 编程,并...
    99+
    2023-09-16
    编程算法 分布式 linux
  • Python中的Numpy面向数组编程常见操作实例分析
    这篇文章主要介绍“Python中的Numpy面向数组编程常见操作实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的Numpy面向数组编程常见操作实例分析”文章能帮助大家解决问题。...
    99+
    2023-07-02
  • Python 并发编程在 Windows 系统下的优缺点分析与应用场景探讨。
    Python 并发编程在 Windows 系统下的优缺点分析与应用场景探讨 随着计算机技术的不断发展和应用场景的不断扩大,越来越多的应用程序需要进行并发编程。而 Python 作为一种高级编程语言,自然也具备了并发编程的能力。本文将围绕 P...
    99+
    2023-11-09
    面试 并发 windows
  • Python编程中闭包的变量作用域问题解析
    目录闭包闭包中的变量闭包 ​ 在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数。而这样,就造成了我们的函数嵌...
    99+
    2024-04-02
  • 分布式系统中的Python编程:你需要知道哪些关键点?
    分布式系统中的Python编程:你需要知道哪些关键点? 分布式系统是现代计算机科学中的一个重要领域,它将计算机资源分散到多个计算节点中,以实现更高效的计算和数据处理。Python是一种流行的编程语言,因其简单易学和丰富的库而备受欢迎。在本文...
    99+
    2023-09-20
    bash 异步编程 分布式
  • Python 在编程中的实际应用和算法分析是什么?
    Python 是一种高级编程语言,是一种解释型语言,具有简单易学、面向对象、开放源代码、可移植性强、运行速度较快等优点,因此被广泛应用于各种领域的编程中。在本文中,我们将探讨 Python 在编程中的实际应用和算法分析。 一、Python...
    99+
    2023-07-19
    unix 编程算法 laravel
  • 编程中的算法,与日志记录有何关联?Python和Linux如何应用?
    在编程中,算法和日志记录是两个非常重要的概念。算法是指一组用于解决特定问题的计算步骤,而日志记录则是记录程序运行时所产生的信息。本文将讨论算法和日志记录的关联,以及Python和Linux如何应用它们。 算法和日志记录的关联 在编程中,算法...
    99+
    2023-10-23
    linux 编程算法 日志
  • 日志记录在 Python 编程中的作用:您是否知道如何正确地记录和分析它们?
    在 Python 编程中,日志记录是一项非常重要的任务。它可以帮助程序员快速诊断和解决问题,同时也可以提供有用的性能指标和统计信息。本文将介绍 Python 中的日志记录功能,包括如何正确地记录和分析日志。 日志记录的基础知识 在 P...
    99+
    2023-07-23
    编程算法 日志 unix
  • Python学习笔记:如何应对响应式编程在分布式系统中的应用?
    随着云计算和大数据技术的发展,分布式系统的应用越来越广泛。而在分布式系统中,响应式编程也成为了一种流行的编程范式。本文将介绍Python中响应式编程的基础知识,并探讨如何应对响应式编程在分布式系统中的应用。 一、响应式编程基础知识 响应式...
    99+
    2023-06-26
    学习笔记 响应 分布式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作