操作 time.sleep(seconds) 是否可以视为异步 I/O?

Does the operation time.sleep(seconds) can be considered as asynchronous I/O?

提问人:Yakir 提问时间:12/15/2022 最后编辑:Yakir 更新时间:12/15/2022 访问量:83

问:

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())
异步 IO python-asyncio 术语

评论

0赞 Paul Cornelius 12/20/2022
Asyncio.sleep() 是一个实用函数,在各种异步情况下非常有用。当然,它本身不做任何 I/O。

答:

0赞 Louis Lac 12/15/2022 #1

套用维基百科,“异步编程”通常是指在主程序流之外发生的事件以及处理此类事件的方式。因此,异步操作不一定是 I/O 操作。

这些异步事件通常在硬件或操作系统级别处理,重要的是要了解,在这个级别上,几乎所有事情都是异步的:作业被放入队列中并由操作系统调度,然后操作系统定期轮询它们是否完成,然后通知主应用程序作业已完成。

此类异步事件包括:

  • 网络请求(由操作系统多路复用和轮询),
  • 定时器(由硬件定时器和中断器管理),
  • 与键盘等各种外部设备通信(硬件中断),
  • 与内部设备(如 GPU)通信(作业提交到命令队列),
  • 等。

AsyncIO 库的目的是允许以更“结构化”和线性的方式表达异步程序。因此,它将许多常见的异步操作(如 I/O 和计时器)包装到异步等待等效项中。因此,AsyncIO 不仅限于异步 I/O 操作,例如,可以实现 AsyncIO async-await 接口来支持 GPU