1.2 什么是 I/O 密集型,什么是 CPU 密集型?
当我们称一个操作为 I/O 密集型或 CPU 密集型时,我们指的是限制该操作运行得更快的因素。这意味着,如果我们提高了该操作所依赖的因素的性能,那么该操作就会在更短的时间内完成。
对于 CPU 密集型操作,如果我们的 CPU 更强大,它会更快完成,例如将其时钟速度从 2 GHz 提高到 3 GHz。对于 I/O 密集型操作,如果我们的 I/O 设备可以在更少的时间内处理更多数据,它就会更快。这可以通过 ISP 增加网络带宽或升级到更快的网卡来实现。
CPU 密集型操作通常是计算和处理 Python 世界中的代码。例如计算圆周率的数字或遍历字典内容并应用业务逻辑。在 I/O 密集型操作中,我们大部分时间都在等待网络或其他 I/O 设备。一个 I/O 密集型操作的例子是向 Web 服务器发出请求,或从我们机器的硬盘驱动器读取文件。
清单 1.1 I/O 密集型和 CPU 密集型操作
import requestsresponse = requests.get('https:/ / www .example .com') ❶items = response.headers.items()headers = [f'{key}: {header}' for key, header in items] ❷formatted_headers = '\n'.join(headers) ❸withopen('headers.txt', 'w') asfile: file.write(formatted_headers) ❹
❶ I/O 密集型网络请求❷ CPU 密集型响应处理❸ CPU 密集型字符串连接❹ I/O 密集型写入磁盘
I/O 密集型和 CPU 密集型操作通常彼此共存。我们首先进行一个 I/O 密集型请求以下载 https://www.example.com 的内容。获得响应后,我们执行一个 CPU 密集型的循环来格式化响应头,并将其转换为由换行符分隔的字符串。然后我们打开一个文件并将该字符串写入该文件,这两个都是 I/O 密集型操作。
异步 I/O 允许我们在进行 I/O 操作时暂停特定方法的执行;我们可以在等待初始 I/O 在后台完成时运行其他代码。这使我们能够同时执行多个 I/O 操作,潜在地加速我们的应用程序。