asyncio --- 异步I/O调度器
该模块实现了相应 CPython 模块的一个子集,如下所述。有关更多信息,请参阅原始CPython文档: asyncio
该模块提供了用于编写并发代码的基础设施,使用协程、事件循环和Future对象。
快速使用示例:
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)
# 在pyboard上运行
from pyb import LED
asyncio.run(main(LED(1), LED(2)))
# 在通用板上运行
from machine import Pin
asyncio.run(main(Pin(1), Pin(2)))
核心函数
- asyncio.create_task(coro)
从给定的协程创建一个新任务并安排它运行。 返回相应的Task对象。
- asyncio.current_task()
返回与当前运行的任务关联的Task对象。
- asyncio.run(coro)
从给定的协程创建一个新任务并运行直到完成。 返回coro返回的值。
- asyncio.sleep(t)
睡眠t秒(可以是浮点数)。 这是一个协程。
- asyncio.sleep_ms(t)
睡眠t毫秒。 这是一个协程,是MicroPython扩展。
附加函数
- asyncio.wait_for(awaitable, timeout)
等待awaitable完成,但如果超过timeout秒则取消它。如果awaitable不是任务,则会从中创建一个任务。 如果发生超时,它会取消任务并引发asyncio.TimeoutError:这应该被调用者捕获。任务会收到asyncio.CancelledError,它可以被忽略或使用try...except或try...finally来运行清理代码。 返回awaitable的返回值。 这是一个协程。
- asyncio.wait_for_ms(awaitable, timeout)
类似于wait_for,但timeout是以毫秒为单位的整数。 这是一个协程,是MicroPython扩展。
- asyncio.gather(*awaitables, return_exceptions=False)
并发运行所有awaitables。任何不是任务的awaitables都会被提升为任务。 返回所有awaitables的返回值列表。 这是一个协程。
类
- class asyncio.Task
这个对象将协程包装成一个运行中的任务。任务可以使用await task来等待,这将等待任务完成并返回任务的返回值。 任务不应该直接创建,而是使用create_task来创建它们。
- Task.cancel()
通过向任务注入asyncio.CancelledError来取消任务。任务可能会忽略此异常。清理代码可以通过捕获它或通过try...finally来运行。
- class asyncio.Event
创建一个新的事件,可用于同步任务。事件开始时处于清除状态。
- Event.is_set()
如果事件已设置,返回True,否则返回False。
- Event.set()
设置事件。任何等待事件的任务都将被安排运行。 注意:这必须在任务中调用。从IRQ、调度器回调或其他线程调用此方法是不安全的。请参阅ThreadSafeFlag。
- Event.clear()
清除事件。
- Event.wait()
等待事件被设置。如果事件已经设置,则立即返回。 这是一个协程。
TCP流连接
- asyncio.open_connection(host, port, ssl=None)
打开到给定主机和端口的TCP连接。主机地址将使用socket.getaddrinfo解析,这目前是一个阻塞调用。 如果ssl是ssl.SSLContext对象,此上下文用于创建传输;如果ssl为True,则使用默认上下文。 返回一对流:读取器和写入器流。 如果主机无法解析或连接无法建立,将引发特定于套接字的OSError。 这是一个协程。
- asyncio.start_server(callback, host, port, backlog=5, ssl=None)
在给定的主机和端口上启动TCP服务器。回调将被调用以处理传入的、已接受的连接,并被传递2个参数:连接的读取器和写入器流。 如果ssl是ssl.SSLContext对象,此上下文用于创建传输。 返回一个Server对象。 这是一个协程。
- class asyncio.Stream
这表示一个TCP流连接。为了最小化代码,此类同时实现了读取器和写入器,StreamReader和StreamWriter都别名为此类。
获取流的额外信息,由v给定。v的有效值为:peername。
- Stream.close()
关闭流。
- Stream.wait_closed()
等待流关闭。 这是一个协程。
- Stream.read(n=-1)
读取最多n个字节并返回它们。如果n未提供或为-1,则读取所有字节直到EOF。如果在读取任何字节之前遇到EOF,返回的值将是一个空字节对象。 这是一个协程。
- Stream.readinto(buf)
读取最多n个字节到buf中,n等于buf的长度。 返回读入buf的字节数。 这是一个协程,是MicroPython扩展。
- Stream.readexactly(n)
读取恰好n个字节并将它们作为字节对象返回。 如果流在读取n个字节之前结束,会引发EOFError异常。 这是一个协程。
- Stream.readline()
读取一行并返回它。 这是一个协程。
- Stream.write(buf)
将buf累积到输出缓冲区。数据只有在调用Stream.drain时才会被刷新。建议在调用此函数后立即调用Stream.drain。
- Stream.drain()
排空(写入)所有缓冲的输出数据到流。 这是一个协程。
事件循环
- asyncio.get_event_loop()
返回用于调度和运行任务的事件循环。请参阅Loop。
- asyncio.new_event_loop()
重置事件循环并返回它。 注意:由于MicroPython只有一个事件循环,此函数只是重置循环的状态,而不是创建一个新的循环。
- class asyncio.Loop
这表示调度和运行任务的对象。它不能被创建,请使用get_event_loop代替。
- Loop.create_task(coro)
从给定的coro创建一个任务并返回新的Task对象。
- Loop.run_forever()
运行事件循环直到调用stop()。
- Loop.run_until_complete(awaitable)
运行给定的awaitable直到完成。如果awaitable不是任务,它将被提升为任务。
- Loop.stop()
停止事件循环。
- Loop.close()
关闭事件循环。
- Loop.set_exception_handler(handler)
设置当Task引发未捕获的异常时要调用的异常处理程序。处理程序应接受两个参数:(loop, context)。
- Loop.get_exception_handler()
获取当前的异常处理程序。返回处理程序,如果没有设置自定义处理程序,则返回None。
- Loop.default_exception_handler(context)
被调用的默认异常处理程序。
- Loop.call_exception_handler(context)
调用当前的异常处理程序。参数context被传递,是一个包含键:'message'、'exception'、'future'的字典。