8. Asyncio¶
到目前为止,本教程中的每个脚本都是 顺序执行 的——一次只运行一行,而一个必须等待的调用(一次传感器读取、一次网络往返、一次快照)会阻塞脚本直到它完成。当只有一件事要做时,这种方式没有问题。但一旦应用程序需要同时做几件事——既运行一个快照循环,又 响应一条串口命令,同时还 通过网络上传帧——顺序执行的脚本就行不通了。第一个慢调用会让其他所有事情都无法继续推进。
asyncio 模块就是 MicroPython 给出的答案。它允许应用程序将多个任务描述为各自独立的 协程,并在单个线程上 协作式地 并发运行它们——当前正在运行的协程在必须等待时,会将控制权交还给调度器。一个快照循环、一个 UART 读取器和一个网络客户端可以全部存在于同一个脚本中,且其中某一个的慢速部分不再会冻结其他部分。
接下来的页面将介绍 async/await 关键字和 Task 生命周期、通过 gather() 和 wait_for() 进行的协调、取消与异常传播、三种内置同步原语(Event、Lock、ThreadSafeFlag)、用于将应用程序类接入 asyncio 惯用法的语言钩子、一个让 snapshot() 能作为协程运行的小型 CSI 包装器,以及协作式调度所伴随的常见陷阱。
自定义异步对象
循环控制
帧捕获
陷阱
总结