Skip to Content
《高性能 Python》第二版
book

《高性能 Python》第二版

by Micha Gorelick, Ian Ozsvald
May 2025
Intermediate to advanced
468 pages
6h 20m
Chinese
O'Reilly Media, Inc.
Content preview from 《高性能 Python》第二版

第 8 章 异步 I/O 异步 I/O

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

到目前为止,我们一直专注于通过增加程序在给定时间内可完成的计算循环次数来加快代码速度。然而,在大数据时代,与实际代码本身相比,向代码获取相关数据可能才是瓶颈所在。在这种情况下,你的程序被称为I/O 约束;换句话说,速度受到输入/输出效率的限制。

I/O 对程序流程来说是一个相当沉重的负担。 每次从文件读取数据或向 Network+ 写入数据时,代码都必须暂停以联系内核,请求进行实际读取,然后等待读取完成。 这是因为实际进行读取操作的不是你的程序,而是内核,因为内核负责管理与硬件的交互。 额外的一层似乎并不是世界末日,尤其是当你意识到每次分配内存时都会发生类似的操作时;但是,如果我们回顾一下图 1-3,就会发现我们执行的大多数 I/O 操作都是在比 CPU 慢几个数量级的设备上进行的。因此,即使与内核的通信速度很快,我们也需要等待相当长的时间,内核才能从设备上获取结果并返回给我们。

例如,在写入 Network+ socket(一个通常需要 1 毫秒的操作)的时间内,我们可能已经在一台 2.4 GHz 的计算机上完成了 2,400,000 条指令。 最糟糕的是,在这 1 毫秒的时间里,我们的程序大部分时间都处于停顿状态--执行暂停,然后等待写入操作完成的信号。 暂停状态下的这段时间称为 I/O 等待

异步 I/O 允许我们在 I/O 等待状态下执行其他操作,从而帮助我们利用这些浪费的时间。 例如,在图 8-1中,我们看到一个程序必须运行三个任务,所有这些任务都有 I/O 等待时间。 如果我们串行运行这些任务,就会遭受三次 I/O 等待惩罚。 但是,如果我们同时运行这些任务,就可以通过在此期间运行另一个任务来隐藏等待时间。 值得注意的是,这一切仍然发生在单线程上,并且一次只使用一个 CPU!

之所以能做到这一点,是因为当程序处于 I/O 等待状态时,内核只是在等待我们请求读取的任何设备(硬盘、网络适配器、GPU 等)发出信号,表明所请求的数据已准备就绪。与其等待,我们可以创建一种机制 (事件循环),这样我们就可以分派数据请求,继续执行计算操作,并在数据准备就绪可以读取时收到通知。这与多进程/多线程(第 9 章)模式形成了鲜明对比,后者启动的新进程会经历 I/O 等待,但会利用现代 CPU 的多任务特性让主进程继续运行。不过,这两种机制通常会同时使用,我们会启动多个进程,其中每个进程都能高效处理异步 I/O,以便充分利用计算机资源。

备注

由于并发程序在单线程上运行,因此通常比标准多线程程序更容易编写和管理。所有并发函数共享相同的内存空间,因此它们之间的数据共享可以按正常方式进行。不过,你仍然需要小心竞赛条件,因为你无法确定哪行代码会在什么时候运行。

通过以这种事件驱动的方式对程序建模,我们就能利用 I/O 等待的优势,在单线程上执行比其他方式更多的操作。

hpp2 0801
图 8-1. 串行和并行程序的比较 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

《学习 Python》第 5 版

《学习 Python》第 5 版

Mark Lutz
ppk on JavaScript

ppk on JavaScript

Peter-Paul Koch

Publisher Resources

ISBN: 9798341657946