扩展¶
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)¶
创建一个内置的 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()
之后立即调用此函数。