提问人:Yakir 提问时间:12/15/2022 最后编辑:Yakir 更新时间:12/15/2022 访问量:83
操作 time.sleep(seconds) 是否可以视为异步 I/O?
Does the operation time.sleep(seconds) can be considered as asynchronous I/O?
问:
Python 中的 asyncio 库,一般来说,当我们谈论异步编程时,我总是想到只在级别线程上执行“并发”I/O 操作,以优化 CPU 使用。 asyncio 库具有 asyncio.sleep(seconds) 的功能,但让我感到不安的是,睡眠操作不是 I/O 操作,睡眠操作是在内核级别使用 CPU 硬件完成的,没有任何可以算作 I/O 的外部设备 [我对 I/O 的定义是除 CPU 和 RAM 之外的所有硬件]。 那么,为什么 asyncio lib(异步 I/O)将此操作称为异步 I/O 操作呢? 这不是我们向其发送请求的网络接口控制器或硬盘。我对“并发”我们在关卡线程上可以执行的每个操作都没有问题。但是,库末尾的 I/O 名称让我觉得它不是正确的术语。我很乐意澄清。
另一个相关的问题,异步编程的术语是仅指“并发”I/O 操作还是每个操作,包括关卡线程上的 x = x + 1 等 CPU 操作?(我想最后一个操作可以在关卡线程上“同时”完成,但这是不必要的)
友情链接: https://docs.python.org/3/library/asyncio.html
代码片段:
import asyncio
async def main():
print('Hello ...')
await asyncio.sleep(1)
print('... World!')
asyncio.run(main())
答:
套用维基百科,“异步编程”通常是指在主程序流之外发生的事件以及处理此类事件的方式。因此,异步操作不一定是 I/O 操作。
这些异步事件通常在硬件或操作系统级别处理,重要的是要了解,在这个级别上,几乎所有事情都是异步的:作业被放入队列中并由操作系统调度,然后操作系统定期轮询它们是否完成,然后通知主应用程序作业已完成。
此类异步事件包括:
- 网络请求(由操作系统多路复用和轮询),
- 定时器(由硬件定时器和中断器管理),
- 与键盘等各种外部设备通信(硬件中断),
- 与内部设备(如 GPU)通信(作业提交到命令队列),
- 等。
AsyncIO 库的目的是允许以更“结构化”和线性的方式表达异步程序。因此,它将许多常见的异步操作(如 I/O 和计时器)包装到异步等待等效项中。因此,AsyncIO 不仅限于异步 I/O 操作,例如,可以实现 AsyncIO async-await 接口来支持 GPU。
评论