扩展¶
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.Future
和 asyncio.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)¶
创建一个内置的任务实例。
loop 是一个可选的事件循环实例。其他参数在
loop.create_task()
描述中进行了解释。在版本 3.11 中更改:添加了 context 参数。
任务生命周期支持¶
第三方任务实现应调用以下函数,以使任务对 asyncio.all_tasks()
和 asyncio.current_task()
保持可见性
- asyncio._register_task(task)¶
将一个新 task 注册为由 asyncio 管理。
从任务构造函数调用该函数。
- asyncio._unregister_task(task)¶
从 asyncio 内部结构中注销一个 task。
当任务即将完成时,应调用该函数。
- asyncio._enter_task(loop, task)¶
将当前任务切换到 task 参数。
在执行嵌入式 协程(
coroutine.send()
或coroutine.throw()
)的一部分之前调用该函数。
- asyncio._leave_task(loop, task)¶
将当前任务从 task 切换回
None
。在
coroutine.send()
或coroutine.throw()
执行后立即调用该函数。