本节将简述用于协程与任务的高层级 API。
源码:
通过 async/await 语法来声明 是编写 asyncio 应用的推荐方式。 例如,以下代码段会打印 "hello",等待 1 秒,再打印 "world":
注意:简单地调用一个协程并不会使其被调度执行
要实际运行一个协程,asyncio 提供了以下几种机制:
- 函数用来运行最高层级的入口点 "main()" 函数 (参见上面的示例。)
- 对协程执行 await。以下代码段会在等待 1 秒后打印 "hello",然后 再次 等待 2 秒后打印 "world":
预期的输出:
- 函数用来并发运行作为 asyncio 的多个协程。
让我们修改以上示例,并发 运行两个 协程:
注意,预期的输出显示代码段的运行时间比之前快了 1 秒:
- 类提供了 的更现代化的替代。 使用此 API,之前的例子将变为:
用时和输出结果应当与之前的版本相同。
如果一个对象可以在 语句中使用,那么它就是 可等待 对象。许多 asyncio API 都被设计为接受可等待对象。
可等待 对象有三种主要类型: 协程, 任务 和 Future.
Python 协程属于 可等待 对象,因此可以在其他协程中被等待:
任务 被用来“并行的”调度协程
当一个协程通过 等函数被封装为一个 任务,该协程会被自动调度执行:
是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果。
当一个 Future 对象 被等待,这意味着协程将保持等待直到该 Future 对象在其他地方操作完毕。
在 asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。
通常情况下 没有必要 在应用层级的代码中创建 Future 对象。
Future 对象有时会由库和某些 asyncio API 暴露给用户,用作可等待对象:
一个很好的返回对象的低层级函数的示例是 。
源码:
任务可以便捷和安全地取消。 当任务被取消时, 将在遇到机会时在任务中被引发。
推荐协程使用 代码块来可靠地执行清理逻辑。 对于 被显式捕获的情况,它通常应当在清理完成时被传播。 会直接子类化 因此大多数代码都不需要关心这一点。
启用结构化并发的 asyncio 组件,如 和 ,在内部是使用撤销操作来实现的因而在协程屏蔽了 时可能无法正常工作。 类似地,用户代码通常也不应调用 。 但是,在确实想要屏蔽 的情况下,则还有必要调用 来完全移除撤销状态。
任务组合并了一套用于等待分组中所有任务完成的方便可靠方式的任务创建 API。
示例:
语句将等待分组中的所有任务结束。 在等待期间,仍可将新任务添加到分组中 (例如,通过将 传入某个协程并在该协程中调用 )。 一旦最后的任务完成并退出 代码块,将无法再向分组添加新任务。
当首次有任何属于分组的任务因 以外的异常而失败时,分组中的剩余任务将被取消。 在此之后将无法添加更多任务到该分组中。 在这种情况下,如果 语句体仍然为激活状态(即 尚未被调用),则直接包含 语句的任务也会被取消。 结果 将中断一个 ,但它将不会跳出包含的 语句。
一旦所有任务被完成,如果有任何任务因 以外的异常而失败,这些异常会被组合在 或 中(选择其中较适合的一个;参见其文档)并将随后引发。
两个基础异常会被特别对待:如果有任何任务因 或 而失败,任务分组仍然会取消剩余的任务并等待它们,但随后初始 或 而不是 或 会被重新引发。
如果 语句体因异常而退出(这样将调用 并附带一个异常),此种情况会与有任务失败时一样对待:剩余任务将被取消然后被等待,而非取消类异常会被加入到一个异常分组并被引发。 传入到 的异常,除了 以外,也都会被包括在该异常分组中。 同样的特殊对待也适用于上一段所说的 和 。
对于任务组应当注意不要将用于“唤醒”其 的内部取消请求与其他地方对其运行的任务提出的取消请求相混淆。 具体来说,当一个任务组在语法上嵌套于另一个任务组中,而两个任务组的某个子任务同时发生异常时,内层的任务组将处理其异常,然后外层的任务组将收到另一个取消请求并处理它自己的异常。
对于任务组在外部被取消同时必须引发 的情况,它将调用父任务的 方法。 这样可以确保 会在下一次 时被引发,因此取消操作不会丢失。
任务组将保留 所报告的取消次数。
While terminating a task group is not natively supported by the standard library, termination can be achieved by adding an exception-raising task to the task group and ignoring the raised exception:
期待的输出:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/1389.html