asyncio --- 异步 I/O 调度器¶
本模块为 async/await 协程提供了一个协作式多任务调度器,并提供了用于同步的原语(锁、事件)以及通过流读取器和写入器实现的非阻塞 TCP 网络功能。任务在单个事件循环上并发运行;当前正在运行的任务通过 await 将控制权交还给循环。
示例:
import asyncio
async def blink(led, period_ms):
while True:
led.on()
await asyncio.sleep_ms(5)
led.off()
await asyncio.sleep_ms(period_ms)
async def main(led1, led2):
asyncio.create_task(blink(led1, 700))
asyncio.create_task(blink(led2, 400))
await asyncio.sleep_ms(10_000)
# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))
核心函数¶
- asyncio.run(coro: Coroutine) Any¶
从给定的协程创建一个新任务,并运行它直到完成。
返回 coro 所返回的值。
附加函数¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
等待 awaitable 完成,但如果其耗时超过 timeout 秒,则将其取消。如果 awaitable 不是任务,则会从它创建一个任务。
如果发生超时,则会取消该任务并抛出
asyncio.TimeoutError:调用方应捕获此异常。任务会收到asyncio.CancelledError,可以忽略它,也可以使用try...except或try...finally捕获它以运行清理代码。返回 awaitable 的返回值。
这是一个协程。
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
类似于
wait_for(),但 timeout 是以毫秒为单位的整数。这是一个协程,也是 MicroPython 的扩展。
class Task¶
- class asyncio.Task¶
该对象将一个协程包装为正在运行的任务。可以使用
await task等待任务,这将等待任务完成并返回任务的返回值。不应直接创建任务,而应使用
create_task()来创建它们。
class Event¶
class ThreadSafeFlag¶
class Lock¶
TCP 流连接¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
打开到给定 host 和 port 的 TCP 连接。host 地址将使用
socket.getaddrinfo()进行解析,该调用目前是阻塞调用。如果 ssl 是一个ssl.SSLContext对象,则使用此上下文来创建传输;如果 ssl 为True,则使用默认上下文。返回一对流:一个读取器流和一个写入器流。如果无法解析主机或无法建立连接,将抛出特定于套接字的
OSError。这是一个协程。
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
在给定的 host 和 port 上启动一个 TCP 服务器。对于传入的、已接受的连接,将调用 callback,并向其传递 2 个参数:该连接的读取器流和写入器流。
如果 ssl 是一个
ssl.SSLContext对象,则使用此上下文来创建传输。返回一个
Server对象。这是一个协程。
- class asyncio.Stream¶
这表示一个 TCP 流连接。为了精简代码,该类同时实现了读取器和写入器,并且
StreamReader和StreamWriter都是该类的别名。- read(n: int = -1) bytes¶
读取最多 n 个字节并返回它们。如果未提供 n 或为 -1,则读取所有字节直到 EOF。如果在读取任何字节之前遇到 EOF,则返回值将是一个空的 bytes 对象。
这是一个协程。
- readinto(buf: bytearray | memoryview) int¶
将最多 n 个字节读取到 buf 中,其中 n 等于 buf 的长度。
返回读取到 buf 中的字节数。
这是一个协程,也是 MicroPython 的扩展。
- write(buf: bytes) None¶
将 buf 累加到输出缓冲区。仅当调用
Stream.drain()时才会刷新数据。建议在调用此函数后立即调用Stream.drain()。
事件循环¶
- class asyncio.Loop¶
这表示调度和运行任务的对象。它无法被创建,请改用
get_event_loop()。- run_until_complete(awaitable: Awaitable) Any¶
运行给定的 awaitable 直到它完成。如果 awaitable 不是任务,则会将其提升为任务。