扩展

asyncio 扩展的主要方向是编写自定义事件循环类。Asyncio 提供了一些助手,可以用来简化这项任务。

注意

第三方应谨慎重用现有的 asyncio 代码,新的 Python 版本可以自由地破坏 API 内部部分的向后兼容性。

编写自定义事件循环

asyncio.AbstractEventLoop 声明了很多方法。从头开始实现所有这些方法是一项繁琐的工作。

一个循环可以通过继承 asyncio.BaseEventLoop 来获得许多常用方法的免费实现。

反过来,继承者应该实现 asyncio.BaseEventLoop 中声明但未实现的一堆私有方法。

例如,loop.create_connection() 检查参数,解析 DNS 地址,并调用 loop._make_socket_transport(),该方法应由继承的类实现。_make_socket_transport() 方法没有文档记录,并且被认为是内部 API。

Future 和 Task 私有构造函数

asyncio.Futureasyncio.Task 绝不应该直接创建,请改用相应的 loop.create_future()loop.create_task(),或 asyncio.create_task() 工厂方法。

但是,第三方事件循环可以重用内置的 future 和 task 实现,以便免费获得复杂且高度优化的代码。

为此,列出了以下私有构造函数

Future.__init__(*, loop=None)

创建内置的 future 实例。

loop 是可选的事件循环实例。

Task.__init__(coro, *, loop=None, name=None, context=None)

创建内置的 task 实例。

loop 是可选的事件循环实例。其余参数在 loop.create_task() 描述中进行了描述。

在 3.11 版本中更改: 添加了 context 参数。

Task 生命周期支持

第三方 task 实现应调用以下函数,以使 task 对 asyncio.all_tasks()asyncio.current_task() 可见。

asyncio._register_task(task)

注册一个新的 task,使其由 asyncio 管理。

从 task 构造函数调用此函数。

asyncio._unregister_task(task)

asyncio 内部结构中注销一个 task

当 task 即将完成时应调用此函数。

asyncio._enter_task(loop, task)

将当前 task 切换到 task 参数。

在执行嵌入式 协程 的一部分之前调用此函数 (coroutine.send()coroutine.throw())。

asyncio._leave_task(loop, task)

将当前 task 从 task 切换回 None

coroutine.send()coroutine.throw() 执行后立即调用此函数。