Python进阶——为什么GIL让多线程变得如此鸡肋?

Python 多线程是多鸡肋 摘要:Python 对并行化支持的名声就不是很好,如果你用过 Python 自带的线程库 thread 和 threading,你应该知道 Python 线程其实并不好用。例如:没有自带的获取线程返回值的方法,需要自己重写自己的threading。目录: Python 多线程 基础 Python 多线程 阻塞 Python 多线程 获取返回值 Python 多线程 数据对比测试 正文: 一. 阅读详情

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

做 Python 开发时,想必你肯定听过 GIL,它经常被 Python 程序员吐槽,说 Python 的多线程非常鸡肋,因为 GIL 的存在,Python 无法利用多线程提高性能。

但事实真的如此吗?

这篇文章,我们就来看一下 Python 的 GIL 到底是什么?以及它的存在,究竟对我们的程序有哪些影响。

GIL是什么?

查阅官方文档,GIL 全称 Global Interpreter Lock,即全局解释器锁,它的官方解释如下:

In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple 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.)

翻译成中文就是:

在 CPython 解释器中,全局解释锁 GIL 是在于执行 Python 字节码时,为了保护访问 Python 对象而阻止多个线程执行的一把互斥锁。这把锁的存在主要是因为 CPython 解释器的内存管理不是线程安全的。然而直到今天 GIL 依旧存在,现在的很多功能已经习惯于依赖它作为执行的保证。

我们从这个定义中,可以看到几个重点:

  1. GIL 是存在于 CPython 解释器中的,属于解释器层级,而并非属于 Python 的语言特性。也就是说,如果你自己有能力实现一个 Python 解释器,完全可以不使用 GIL
  2. GIL 是为了让解释器在执行 Python 代码时,同一时刻只有一个线程在运行,以此保证内存管理是安全的
  3. 历史原因,现在很多 Python 项目已经习惯依赖 GIL(开发者认为 Python 就是线程安全的,写代码时对共享资源的访问不会加锁)

在这里我想强调的是,因为 Python 默认的解释器是 CPython,GIL 是存在于 CPython 解释器中的,我们平时说到 GIL 就认为它是 Python 语言的问题,其实这个表述是不准确的。

其实除了 CPython 解释器,常见的 Python 解释器还有如下几种:

  • CPython:C 语言开发的解释器,官方默认使用,目前使用也最为广泛,存在 GIL
  • IPython:基于 CPython 开发的交互式解释器,只是增强了交互功能,执行过程与 CPython 完全一样
  • PyPy:目标是加快执行速度,采用 JIT 技术,对 Python 代码进行动态编译(不是解释),可以显著提高代码的执行速度,但执行结果可能与 CPython 不同,存在 GIL
  • Jython:运行在 Java 平台的 Python 解释器,可以把 Python 代码编译成 Java 字节码,依赖 Java 平台,不存在 GIL
  • IronPython:和 Jython 类似,运行在微软的 .Net 平台下的 Python 解释器,可以把 Python 代码编译成 .Net 字节码,不存在 GIL

虽然有这么多 Python 解释器,但使用最广泛的依旧是官方提供的 CPython,它默认是有 GIL 的。

那么 GIL 会带来什么问题呢?为什么开发者总是抱怨 Python 多线程无法提高程序效率?

GIL带来的问题

想要了解 GIL 对 Python 多线程带来的影响,我们来看一个例子。

import threading

def loop():
    count = 0
    while count <= 1000000000:
        count += 1

# 2个线程执行loop方法
t1 = threading.Thread(target=loop)
t2 = threading.Thread(target=loop)

t1.start()
t2.start()
t1.join()
t2.join()
复制代码

在这个例子中,虽然我们开启了 2 个线程去执行 loop,但我们观察 CPU 的使用情况,发现这个程序只能跑满一个 CPU 核心,没有利用到多核。

这就是 GIL 带来的问题。

其原因在于,一个 Python 线程想要执行一段代码,必须先拿到 GIL 锁后才被允许执行,也就是说,即使我们使用了多线程,但同一时刻却只有一个线程在执行。

但我们进一步思考一下,就算有 GIL 的存在,理论来说,如果 GIL 释放的够快,多线程怎么也要比单线程执行效率高吧?

但现实的结果是:多线程比我们想象的更糟糕。

我们再来看一个例子,还是运行一个 CPU 密集型的任务程序,我们来看单线程执行 2 次和 2 个线程同时执行,哪个效率更高?

单线程执行 2 次 CPU 密集型任务:

import time
import threading

def loop():
    count = 0
    while count <= 1000000000:
        count += 1


# 单线程执行 2 次 CPU 密集型任务
start = time.time()
loop()
loop()
end = time.time()
print("execution time: %s" % (end - start))
# execution time: 89.63111019134521
复制代码

从结果来看,执行耗时 89秒。

再来看 2 个线程同时执行 CPU 密集型任务:

import time
import threading

def loop():
    count = 0
    while count <= 1000000000:
        count += 1


# 2个线程同时执行CPU密集型任务
start = time.time()

t1 = threading.Thread(target=loop)
t2 = threading.Thread(target=loop)
t1.start()
t2.start()
t1.join()
t2.join()

end = time.time()
print("execution time: %s" % (end - start))
# execution time: 92.29994678497314
复制代码

执行耗时却达到了 92 秒。

从执行结果来看,多线程的效率还不如单线程的执行效率高!

为什么会导致这种情况?我们来看一下 GIL 究竟是怎么回事。

GIL原理

其实,由于 Python 的线程就是 C 语言的 pthread,它是通过操作系统调度算法调度执行的。

Python 2.x 的代码执行是基于 opcode 数量的调度方式,简单来说就是每执行一定数量的字节码,或遇到系统 IO 时,会强制释放 GIL,然后触发一次操作系统的线程调度。

虽然在 Python 3.x 进行了优化,基于固定时间的调度方式,就是每执行固定时间的字节码,或遇到系统 IO 时,强制释放 GIL,触发系统的线程调度。

但这种线程的调度方式,都会导致同一时刻只有一个线程在运行。

而线程在调度时,又依赖系统的 CPU 环境,也就是在单核 CPU 或多核 CPU 下,多线程在调度切换时的成本是不同的。

如果是在单核 CPU 环境下,多线程在执行时,线程 A 释放了 GIL 锁,那么被唤醒的线程 B 能够立即拿到 GIL 锁,线程 B 可以无缝接力继续执行,执行流程如下图:

而如果在在多核 CPU 环境下,当多线程执行时,线程 A 在 CPU0 执行完之后释放 GIL 锁,其他 CPU 上的线程都会进行竞争。

但 CPU0 上的线程 B 可能又马上获取到了 GIL,这就导致其他 CPU 上被唤醒的线程,只能眼巴巴地看着 CPU0 上的线程愉快地执行着,而自己只能等待,直到又被切换到待调度的状态,这就会产生多核 CPU 频繁进行线程切换,消耗资源,这种情况也被叫做「CPU颠簸」。整个执行流程如下图:

图中绿色部分是线程获得了 GIL 并进行有效的 CPU 运算,红色部分是被唤醒的线程由于没有争夺到 GIL,只能无效等待,无法充分利用 CPU 的并行运算能力。

这就是多线程在多核 CPU 下,执行效率还不如单线程或单核 CPU 效率高的原因。

到此,我们可以得出一个结论:如果使用多线程运行一个 CPU 密集型任务,那么 Python 多线程是无法提高运行效率的。

别急,你以为事情就这样结束了吗?

我们还需要考虑另一种场景:如果多线程运行的不是一个 CPU 密集型任务,而是一个 IO 密集型的任务,结果又会如何呢?

答案是,多线程可以显著提高运行效率!

其实原因也很简单,因为 IO 密集型的任务,大部分时间都花在等待 IO 上,并没有一直占用 CPU 的资源,所以并不会像上面的程序那样,进行无效的线程切换。

例如,如果我们想要下载 2 个网页的数据,也就是发起 2 个网络请求,如果使用单线程的方式运行,只能是依次串行执行,其中等待的总耗时是 2 个网络请求的时间之和。

而如果采用 2 个线程的方式同时处理,这 2 个网络请求会同时发送,然后同时等待数据返回(IO等待),最终等待的时间取决于耗时最久的线程时间,这会比串行执行效率要高得多。

所以,如果需要运行 IO 密集型任务,Python 多线程是可以提高运行效率的。

为什么会有GIL?

我们已经了解到,GIL 对于处理 CPU 密集型任务的场景,多线程是无法提高运行效率的。

既然 GIL 的影响这么大,那为什么 Python 解释器 CPython 在设计时要采用这种方式呢?

这就需要追溯历史原因了。

在 2000 年以前,各个 CPU 厂商为了提高计算机的性能,其努力方向都在提升单个 CPU 的运行频率上,但在之后的几年遇到了天花板,单个 CPU 性能已经无法再得到大幅度提升,所以在 2000 年以后,提升计算机性能的方向便改为向多 CPU 核心方向发展。

为了更有效的利用多核心 CPU,很多编程语言就出现了多线程的编程方式,但也正是有了多线程的存在,随之带来的问题就是多线程之间对于维护数据和状态一致性的困难。

Python 设计者在设计解释器时,可能没有想到 CPU 的性能提升会这么快转为多核心方向发展,所以在当时的场景下,设计一个全局锁是那个时代保护多线程资源一致性最简单经济的设计方案。

而随着多核心时代来临,当大家试图去拆分和去除 GIL 的时候,发现大量库的代码和开发者已经重度依赖 GIL(默认认为 Pythonn 内部对象是线程安全的,无需在开发时额外加锁),所以这个去除 GIL 的任务变得复杂且难以实现。

所以,GIL 的存在更多的是历史原因,在 Python 3 的版本,虽然对 GIL 做了优化,但依旧没有去除掉,Python 设计者的解释是,在去除 GIL 时,会破坏现有的 C 扩展模块,因为这些扩展模块都严重依赖于 GIL,去除 GIL 有可能会导致运行速度会比 Python 2 更慢。

Python 走到现在,已经有太多的历史包袱,所以现在只能背负着它们前行,如果一切推倒重来,想必 Python 设计者会设计得更加优雅一些。

解决方案

既然 GIL 的存在会导致这么多问题,那我们在开发时,需要注意哪些地方,避免受到 GIL 的影响呢?

我总结了以下几个方案:

  1. IO 密集型任务场景,可以使用多线程可以提高运行效率
  2. CPU 密集型任务场景,不使用多线程,推荐使用多进程方式部署运行
  3. 更换没有 GIL 的 Python 解释器,但需要提前评估运行结果是否与 CPython 一致
  4. 编写 Python 的 C 扩展模块,把 CPU 密集型任务交给 C 模块处理,但缺点是编码较为复杂
  5. 更换其他语言 :)

总结

这篇文章我们主要讲了 Python GIL 相关的问题。

首先,我们了解到 GIL 属于 Python 解释器层面的,它并不是 Python 语言的特性,这一点我们一定不要搞混了。GIL 的存在会让 Python 在执行代码时,只允许同一时刻只有一个线程在执行,其目的是为了保证在执行过程中内存管理的安全性。

之后我们通过一个例子,观察到 Python 在多线程运行 CPU 密集型任务时,执行效率比单线程还要低,其原因是因为在多核 CPU 环境下,GIL 的存在会导致多线程切换时无效的资源消耗,因此会降低程序运行的效率。

但如果使用多线程运行 IO 密集型的任务,由于线程更多地是在等待 IO,所以并不会消耗 CPU 资源,这种情况下,使用多线程是可以提高程序运行效率的。

最后,我们分析了 GIL 存在的原因,更多是因为历史问题导致,也正因为 GIL 的存在,很多 Python 开发者默认 Python 是线程安全的,这也间接增加了去除 GIL 的困难性。

基于这些前提,我们平时在部署 Python 程序时,一般更倾向于使用多进程的方式去部署,就是为了避免 GIL 的影响。

任何一种编程语言,都有其优势和劣势,我们需要理解它的实现机制,发挥其长处,才能更好地服务于我们的需求。

想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!

Mamba vs YOLO:目标检测选型指南(附实际项目对比) 本文深入对比了Mamba和YOLO在目标检测领域的性能差异与应用场景。通过实际项目数据,分析了两者在城市交通监控、工业质检等场景下的表现,提供了详细的选型指南和部署优化建议,帮助开发者根据实时性、精度等需求选择最适合的解决方案。 阅读详情

相关推荐

中文顶刊《会计研究》文本分析技术最新进展总结盘点

会计研究》是由中华人民共和国财政部主管、中国会计学会主办的国家一级学术期刊,为会计领域中文顶级期刊。随着大数据技术的日益成熟, 社交网络类文本 、上市公司披露类文本、媒体报道类文本、 其他类文本 、网络搜索数据、P2P 网络借贷文 本与分析师报告等文本数据逐渐成为财务会计的研究素材。

qq_52891550的博客 2891

Python GIL理解及对多线程的影响

In在这里我想强调的是,存在 GIL存在 GIL虽然有这么多 Python 解释器,但使用最广泛的依旧是官方提供的 CPython,它默认是有 GIL 的。其实,由于 Python 的线程就是 C 语言的 pthread,它是通过操作系统调度算法调度执行的。Python 2.x 的代码执行是基于 opcode 数量的调度方式,简单来说就是每执行一定数量的字节码,或遇到系统 IO 时,会强制释放 GIL,然后触发一次操作系统的线程调度。虽然在 Python 3.x 进行了优化,基于。

u013531487的专栏 1394

Codex CLI 接入智谱 GLM-5.1 完整教程

Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。

u011831527的博客 2573

Python 并发:全局解释器锁(GIL)及其对多线程的影响

Python 是一种流行的高级编程语言,以其简单、易用和快速开发而著称。然而,Python 的垃圾回收机制依赖于全局解释器锁(GIL: Global Interpreter Lock),这可能会造成一些限制。本文将探讨 Python 中指针的各个方面,尤其是 GIL 对内存管理、多线程和 CPU 利用率的影响。此外,本文还将提供具体示例来说明其局限性和解决方法。

JP.Zhang 1088

NVIDIA Video Codec SDK-解码接口cuvid简介

特性已废弃的 NVCUVID现代的 NVDECODE (底层 API)现代的 NVDECODE (高层 API - NvDecoder)状态已废弃 (Deprecated)官方推荐 (底层控制)官方推荐 (易用性首选)编程模型C 函数C 函数C++ 类复杂度高,需要管理大量细节中高,仍需管理解码会话低,开箱即用灵活性高高中(满足绝大多数场景)推荐对象遗留项目维护需要极致控制的高级用户所有新项目、大多数开发者。

fudexiang的博客 1176

用Python 绘制一个只属于你自己的世界地图

Python之所以这么流行,是因为它不仅能够应用于科技领域,还能用来做许多其他学科的研究工具,绘制地图便是其功能之一。 今天我们用matplot工具包之一的mpl_toolkits来绘制世界地图,这是一个简单的可视化工具,如果希望绘制更加复杂的地图,可以考虑使用Google Maps API,不过这不在我们今天的讨论范围之内。 1.安装 为了能够顺利开展本项目,你需要先安装以下依赖,在cmd或Terminal中输入以下命令: pipinstallnumpy pipinstallm...

qq_38887171的博客 1870

Python-GIL(全局锁-影响多线程速度的罪魁祸首)

表现:我发送请求,等别人计算完成后返回给我;站在自己业务逻辑的角度,就是在等待。耗时:指从发送请求到接收返回值这期间的耗时。通常耗时很高,至少是毫秒ms级别,比如数据库10ms、远程缓存2ms、服务调用50ms。机器:负载很低,CPU在等待,很空闲、不占用CPU资源。场景: 访问数据库, http请求 ,访问本地磁盘反正只要是你去索要某件东西的时候,并且需要等待进行接收 都属于io密集表现:收到参数后,自己本地(本机)计算,最终算出结果;全靠自己计算。耗时:指计算完成的耗时。

weixin_45203607的博客 1147

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

在Python中,GIL对多线程性能的影响有多大?

在Python中,全局解释器锁(GIL)对多线程的性能影响是显著的,尤其是在CPU密集型任务中。

weixin_43822401的博客 1483

华为OD机试双机位C卷-组装新的数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【组装新的数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 组装新的数组。

qq_45776114的博客 1145

[QMT量化交易小白入门]-三十七、QMT中如何使用类似于通达信中的VBA函数(量化python代码解析)

这段代码主要围绕着在QMT环境中实现类似通达信VBA函数的功能展开,核心功能是基于RSI指标来判断股票的买卖时机,并根据持仓情况进行相应的交易操作。class G():passg = G()这里定义了一个空类G,并创建了该类的实例g。这个实例g将作为全局变量来存储一些在整个程序运行过程中需要共享的数据,例如除复权类型、股票代码、目标数量等。1、使用VBA开发策略时,参数固化的问题会带来一些限制,比如无法修改MA函数的周期参数,只能使用固定周期。

木头大左的博客 1690

揭秘Python之心:全局解释器锁(GIL)及其对多线程编程的深刻影响

Python作为一种广泛使用的高级编程语言,以其易于学习和高效的代码执行而受到开发者的青睐。然而,在其灵活和动态的特性背后,存在一个核心机制,即全局解释器锁(Global Interpreter Lock,简称GIL),这是理解Python多线程处理和性能优化的关键。GIL是一个争议性的话题,它在Python社区中引发了广泛的讨论,原因在于它对多线程程序的性能有着显著的影响。GIL的主要作用是管理对Python对象的访问,确保在解释器级别上任何时候只有一个线程执行。

Von_016's Blog 1582

自定义View系列教程04--Draw源码分析及其实践

通过之前的详细分析,我们知道:在measure中测量了View的大小,在layout阶段确定了View的位置。 完成这两步之后就进入到了我们相对熟悉的draw阶段,在该阶段真正地开始对视图进行绘制。按照之前的惯例,我们来瞅瞅View中draw( )的源码 public void draw(Canvas canvas) { final int privateFlags = mPriv

谷哥的小弟 2万+

Python进阶:为什么GIL让多线程变得如此鸡肋?

阅读本文大约需要 9 分钟。做 Python 开发时,想必你肯定听过 GIL,它经常被 Python 程序员吐槽,说 Python 的多线程非常鸡肋,因为 GIL 的存在,Python 无法利用多线程提高性能。但事实真的如此吗?这篇文章,我们就来看一下 Python 的 GIL 到底是什么?以及它的存在,到底对我们的程序有哪些影响。GIL是什么?查阅官方文档,GIL 全称 Global Interpreter Lock,即全局解释器锁,它的官方解释如下:In CPython, the global inte

Python学习与数据挖掘 1000

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

为什么GIL让多线程变得如此鸡肋?

做 Python 开发时,想必你肯定听过 GIL,它经常被 Python 程序员吐槽,说 Python 的多线程非常鸡肋,因为 GIL 的存在,Python 无法利用多线程提高性能。 但事实真的如此吗? 这篇文章,我们就来看一下 Python 的 GIL 到底是什么?以及它的存在,到底对我们的程序有哪些影响。 GIL是什么? 查阅官方文档,GIL 全称 Global Interpreter Lock,即全局解释器锁,它的官方解释如下: In CPython, the global interpr

m0_50414588的博客 160

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

为什么有人说 Python 多线程是鸡肋?

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?有同学可能知道答案,因为 Python 中臭名昭著的 GIL,GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗?GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

wangluoanquan111的博客 909

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

为什么 GIL 让多线程变得如此鸡肋?

做 Python 开发时,想必你肯定听过 GIL,它经常被 Python 程序员吐槽,说 Python 的多线程非常鸡肋,因为 GIL 的存在,Python 无法利用多线程提高性能。但事实...

Python中文社区 211

为什么有人说 Python 多线程是鸡肋

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?有同学可能知道答案,因为 Python 中臭名昭著的 GIL,GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗?GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

A_991128a的博客 1196

python没有多线程_为什么有人说 Python 多线程是鸡肋?

「若你有原创文章想与大家分享,欢迎投稿。」为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?有同学可能知道答案,因为 Python 中臭名昭著的 GIL。那么 GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一...

weixin_39895096的博客 170

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

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋? 有同学可能知道答案,因为 Python 中臭名昭著的 GIL。 那么 GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一...

dengxiangbao3167的博客 195

python 多线程并行_为什么有人说 Python 多线程是鸡肋?python程序员告诉你

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?有同学可能知道答案,因为 Python 中臭名昭著的 GIL,GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。多线程是不是鸡...

weixin_39883194的博客 431

鸡肋的python 多线程

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋? 多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 “1亿” 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少? 单线程 在我的4核 CPU ...

若明 333

Python之多进程与多线程

前言:为什么有人说 Python 的多线程是鸡肋,不是真正意义上的多线程? 看到这里,也许你会疑惑。这很正常,所以让我们带着问题来阅读本文章吧。问题: 1、Python多线程为什么耗时更长? 2、为什么在Python里面推荐使用多进程而不是多线程? 1 基础知识 现在的PC都是多核的,使用多线程能充分利用CPU来提供程序的执行效率。 1.1 线程 线程是一个基本的CPU执行单元。...

ZONGXP的博客 6万+

python 多线程为什么鸡肋?

什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。 在多线程环境中,Python 虚拟机按以下方式执行:

轻锋的专栏 2859
上一篇: 只用十行 Python 代码就提取了韦小宝的身份证信息
下一篇: 用Python分析北京市蛋壳公寓租房数据
pythonputao
博客等级 码龄6年 60粉丝 111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值