扩展¶
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 生命周期支持¶
第三方任务实现应当调用下列函数以使任务对 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 (
coroutine.send()
或coroutine.throw()
) 的一部分之前调用此函数。
- asyncio._leave_task(loop, task)¶
将当前任务从 task 切换回
None
。在
coroutine.send()
或coroutine.throw()
执行之后调用此函数。