Python 中的并发和并行
是的,我已经停止在这里发布,但从营销的角度来看,最好继续发布......我们继续。
文本最初发布于此处。
本文的目的是直接总结理解 Python 语言中的并发和并行性所需的基本概念。我建议您了解该主题的最低背景知识,或者将本文与其他来源的研究结合起来。所有参考资料均在文末。
我将涵盖以下主题:
- 什么是进程?
- 什么是线程?
- I/O 限制和 CPU 限制是什么意思?
- 什么是 Python GIL?
- 什么是竞争?
- 什么是并行?
- asyncio 库
- 线程库
- 多处理库
什么是流程?
在计算中,进程是正在运行的应用程序的实例。如果您在计算机上打开一个应用程序(例如浏览器),该应用程序将与某个进程关联。一个进程由以下部分组成:
- 硬件上下文:存储通用寄存器和CPU特定寄存器的内容
- 软件上下文:指定进程可以分配的资源
- 地址空间:指定进程所属的内存区域
以下图片取自 Francis Machado 和 Luis Maia 的书:
此信息是执行程序所必需的。
什么是线程?
线程是程序的子例程,是操作系统管理的最小执行单元,也是进程的组件。
假设进程的各个线程可以并发执行(我们很快就会理解),共享内存等资源。不同的进程不共享这些资源。
下图取自维基百科:
解释上图,我们可以得出,一个程序保存在磁盘(辅助非易失性存储器)上,包含多个指令,并且可以在一个或多个进程中实例化(启动),而这些又可以具有几个相关的线程。
I/O 限制和 CPU 限制是什么意思?
这两个表达在有关竞争的讨论中出现很多,并且可以在葡萄牙语中与 I/O(输入/输出)和 CPU(中央处理单元)一起出现。
当我们谈论 I/O 限制和 CPU 限制时,我们谈论的是阻止操作在计算机上更快运行的限制因素,我们可以在同一代码库中找到这两种类型的操作。
CPU 密集型操作是 CPU 密集型操作,如果 CPU 更强大,运行速度会更快。换句话说,如果我们将时钟速度从 2GHz 提高到 4GHz,该操作可能会运行得更快。我们在这里讨论的是执行许多计算、计算的操作;例如,如何计算 Pi。
I/O 绑定操作取决于网络速度以及输入和输出设备的速度。向 Web 服务器发出请求或从磁盘读取文件是 I/O 绑定操作。
两种类型的操作都可以从并发的使用中受益。
Python 的 GIL 是什么?
GIL 代表全局解释器锁,旨在防止一个Python 进程同时执行多个Python 指令字节码。要运行一个线程,必须“获取”GIL,而当一个线程持有 GIL 时,另一个线程无法同时获取它。这并不意味着我们在这种情况下不能有多个线程。
这里我们正在考虑Python参考实现。 CPython 是 Python 的标准实现,用作该语言行为方式的参考。还有其他实现,例如 Jython 或 IronPython。 GIL 存在于 CPython 中,直到最近我们才收到 PEP(Python 增强提案)建议将 GIL 设为可选。
GIL 的想法是防止竞争条件,当多个线程需要同时引用一个 Python 对象时,就会出现这种情况。如果多个线程修改共享变量,则该变量可能会处于意外状态。图片取自 Matthew Fowler 的书:
在上图中,两个线程试图同时增加引用计数,由于两个线程都增加了 1,所以最终结果给出了 1(每个线程是一列),而不是计数给出 2。
什么是竞争?
当处理多个任务时,就会发生计算竞争,而不必完全同时执行这两个任务。 Rob Pyke 关于这个主题的著名短语:
竞争意味着同时处理很多事情。并行性是同时做很多事情。
想象一下这个假设的情况:如果你要做两个蛋糕,你可以先预热烤箱,同时准备第一个蛋糕的面团。一旦烤箱达到正确的温度,您就可以将第一个蛋糕的面团放入烤箱,在等待蛋糕在烤箱中发酵的同时,您可以准备第二个蛋糕的面团。竞争的思路基本上就是这样,你不需要闲着、卡住、停止,在等待任务完成的时候,你可以做一个切换,改变任务。
在这种情况下,我们有两种类型的多任务处理:
- 协作多任务处理:在此模型中,我们在代码中解释了任务可以切换的点。在Python中,这是使用事件循环(一种常见的设计模式)来实现的,仅使用一个线程和一个CPU核心,例如使用asyncio与async和await
- 抢占式多任务处理:在此模型中,我们让操作系统处理开关。在 Python 中,这是通过多个线程和一个 CPU 核心来实现的,例如使用线程库
下图有助于总结 Python 中的并发性:
什么是并行性?
并行意味着多个任务同时执行。换句话说,并行意味着并发(处理多个任务),但并发并不意味着并行(任务不一定同时并行执行)。为了使并行性成为可能,我们需要多个 CPU 核心。
在 Python 中,并行性是通过多处理库实现的,其中我们将拥有多个 Python 进程,每个进程都有自己的 GIL。该图有助于说明 Python 中的并行性:
异步库
在 Python 中实现并发和并行有不同的方法,我们可以使用一些库来优化我们的代码,具体取决于我们正在处理的操作类型,I/O 限制或 CPU 限制。 asyncio 是一个使用 async 和await 实现并发的库。来自文档:
Asyncio 被用作多个异步 Python 框架的基础,这些框架提供高性能网络和 Web 服务器、数据库连接库、分布式作业队列等。
正如你想象的那样,这个库适合优化 I/O 密集型任务,其中有网络等待时间、写入磁盘等。在 CPU 密集型操作中,没有等待,我们只依赖于 CPU 计算速度。
线程库
Python 的线程库允许我们操作多个线程,但是,我们仍然处理一个 CPU 核心和一个 Python 进程,请记住,这是操作系统执行抢占式多任务处理的一种情况我们的任务切换。该库对于优化 I/O 绑定操作也更有用。
关于线程,Real Python 网站提供了一些要点:
由于操作系统控制一个任务何时停止以及另一个任务何时启动,因此线程之间共享的任何数据都需要受到保护,或者线程安全。不幸的是 requests.Session() 不是线程安全。有多种策略可以使数据访问线程安全,具体取决于数据是什么以及您如何使用它。其中之一是使用线程安全数据结构作为Python队列模块的Queue。
我们在这里找到了队列文档。
多处理库
关于Python文档中的多处理库:
multiprocessing 是一个支持使用类似于 threading 模块的 API 生成进程的包。多处理包提供本地和远程并发,通过使用子进程而不是线程有效地绕过 GIL。这就是为什么多处理模块允许程序员利用一台机器上的多个处理器。
值得指出的是,在不同的CPU核心上运行多个进程并不意味着禁用GIL,而是每个进程都会有自己的GIL。通过利用多个 CPU 核心,在多个可用核心之间分担繁重的 CPU 工作负载,该库更适合 CPU 限制。
来源:
福勒,马修。 Python 与 asyncio 的并发。曼宁出版社,2022 年。
马查多,弗朗西斯·贝伦热;玛雅,路易斯·保罗。操作系统架构:包括 SOSIM 模拟器练习和 ENADE 问题。里约热内卢:LTC,2013。
维基百科的线程(计算)
通过真正的 Python 并发来加速你的 Python 程序
以上是Python 中的并发和并行的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python因其简洁与强大而备受青睐,适用于从初学者到高级开发者的各种需求。其多功能性体现在:1)易学易用,语法简单;2)丰富的库和框架,如NumPy、Pandas等;3)跨平台支持,可在多种操作系统上运行;4)适合脚本和自动化任务,提升工作效率。
