uasyncio — 异步 I/O 调度器

该模块实现了相应CPython 模块的 一个子集,如下所述。有关更多信息,请参阅原始 CPython 文档: asyncio

示例:

import uasyncio

async def blink(led, period_ms):
    while True:
        led.on()
        await uasyncio.sleep_ms(5)
        led.off()
        await uasyncio.sleep_ms(period_ms)

async def main(led1, led2):
    uasyncio.create_task(blink(led1, 700))
    uasyncio.create_task(blink(led2, 400))
    await uasyncio.sleep_ms(10_000)

# Running on a pyboard
from pyb import LED
uasyncio.run(main(LED(1), LED(2)))

# Running on a generic board
from machine import Pin
uasyncio.run(main(Pin(1), Pin(2)))

核心功能

uasyncio.create_task(coro)

从给定的协程创建一个新任务并安排它运行。

返回相应的Task对象。

uasyncio.current_task()

返回Task与当前正在运行的任务关联的对象。

uasyncio.run(coro)

从给定的协程创建一个新任务并运行它直到完成

返回coro返回的值。

uasyncio.sleep(t)

睡眠t秒(可以是浮点数)。

这是一个协程。

uasyncio.sleep_ms(t)

休眠t毫秒。

这是一个协程,也是一个 MicroPython 扩展。

附加功能

uasyncio.wait_for(awaitable, timeout)

等待awaitable完成,但如果它需要更长的超时秒数,请取消它。如果awaitable不是任务,那么将从它创建一个任务。

如果发生超时,它会取消任务并引发asyncio.TimeoutError: :这应该被调用者捕获。

返回awaitable的返回值。

这是一个协程。

uasyncio.wait_for_ms(awaitable, timeout)

类似于wait_for但超时是以毫秒为单位的整数。

这是一个协程,也是一个 MicroPython 扩展。

uasyncio.gather(*awaitables, return_exceptions=False)

同时运行所有等待。任何不是任务的等待项都被提升为任务。

返回所有awaitables的返回值列表。

这是一个协程。

班级任务

class uasyncio.Task

这个对象将一个协程包装成一个正在运行的任务。可以使用等待任务,它会等待任务完成并返回任务的返回值。await task

任务不应直接创建,而create_task 应用于创建它们。

Task.cancel()

通过向其中注入 a 来取消任务CancelledError。任务可能会也可能不会忽略此异常。

班级活动

class uasyncio.Event

创建一个可用于同步任务的新事件。事件以清除状态开始。

Event.is_set()

True如果设置了事件,则返回,False否则返回。

Event.set()

设置事件。任何等待事件的任务都将被安排运行。

注意:这必须从任务中调用。从 IRQ、调度程序回调或其他线程调用它是不安全的。见ThreadSafeFlag

Event.clear()

清除事件。

Event.wait()

等待事件被设置。如果事件已经设置,那么它会立即返回。

这是一个协程。

类 ThreadSafeFlag

class uasyncio.ThreadSafeFlag

创建一个新标志,该标志可用于将任务与在 asyncio 循环外运行的代码(例如其他线程、IRQ 或调度程序回调)同步。标志以清除状态开始。

ThreadSafeFlag.set()

立旗。如果有任务在等待事件,它将被安排运行。

ThreadSafeFlag.wait()

等待标志被设置。如果标志已经设置,那么它会立即返回。

一个标志一次只能由一个任务等待。

这是一个协程。

类锁

class uasyncio.Lock

创建一个可用于协调任务的新锁。锁从解锁状态开始。

除了以下方法之外,还可以在语句中使用锁。 async with statement.

Lock.locked()

True如果锁被锁定,则返回,否则返回False

Lock.acquire()

等待锁处于解锁状态,然后以原子方式将其锁定。任何时候只有一个任务可以获取锁。

这是一个协程。

Lock.release()

释放锁。如果有任何任务正在等待锁定,则将安排队列中的下一个任务运行,并且锁定保持锁定状态。否则,没有任务在等待锁被解锁。

TCP 流连接

uasyncio.open_connection(host, port)

打开到给定主机和端口的 TCP 连接。该主机地址将使用来解决socket.getaddrinfo,这是目前一个阻塞调用。

返回一对流:一个读取器和一个写入器流。OSError如果无法解析主机或无法建立连接,则将引发特定于套接字的套接字。

这是一个协程。

uasyncio.start_server(callback, host, port, backlog=5)

在给定的主机和端口上启动 TCP 服务器。该回调将传入的,接受的连接被调用,并通过2个参数:读写器流进行连接。

返回一个Server 对象。

这是一个协程。

class uasyncio.Stream

这表示 TCP 流连接。为了最大限度地减少代码此类将实现读者和作家,都StreamReaderStreamWriter 别名此类。

Stream.get_extra_info(v)

获取有关流的额外信息,由v给出。v的有效值为: peername

Stream.close()

关闭流。.

Stream.wait_closed()

等待流关闭。

这是一个协程。

Stream.read(n)

最多读取n个字节并返回它们。

这是一个协程。

Stream.readinto(buf)

最多读取 n 个字节到buf 中,n 等于buf的长度。

返回读入buf的字节数。

这是一个协程,也是一个 MicroPython 扩展。

Stream.readline()

读取一行并返回。

这是一个协程。

Stream.write(buf)

累积的buf到输出缓冲区。数据仅在 Stream.drain 被调用时刷新 。建议Stream.drain调用该函数后立即调用。 Stream.drain( )

Stream.drain()

将所有缓冲的输出数据排出(写入)到流中。

这是一个协程。

class uasyncio.Server

这表示从 返回的服务器类start_server。它可用于在退出时关闭服务器的语句。async with

Server.close()

关闭服务器。

Server.wait_closed()

等待服务器关闭。

这是一个协程。

事件循环

uasyncio.get_event_loop()

返回用于调度和运行任务的事件循环。见Loop.

uasyncio.new_event_loop()

重置事件循环并返回它

注意: 由于 MicroPython 只有一个事件循环,这个函数只是重置循环的状态,它不会创建一个新的循环。

class uasyncio.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)

调用当前异常处理程序。参数上下文被传递并且是一个包含键的字典:'message', 'exception', 'future'.