1

我是异步的新手。我最近遇到了 AIOFiles ( https://github.com/Tinche/aiofiles ),并在文档中看到它支持“async with”和“async for”。我想了解它,但除了 PEP 492 之外没有太多好的报道,它没有详细介绍。

PEP 492 相关部分的快捷方式:

https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with

https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for

如果有人不介意回答,我有很多问题:

  1. 我提到的异步迭代器/上下文管理器唯一明显的好处是您可以在其所需的魔术方法的实现中使用可等待对象。我错过了什么还是就是这样?

  2. 在关于异步上下文管理器的 PEP 492 中,它说“异步上下文管理器是能够在其进入和退出方法中暂停执行的上下文管理器。” 这是指使用等待调用协程吗?

4

1 回答 1

1

我提到的异步迭代器/上下文管理器唯一明显的好处是您可以在其所需的魔术方法的实现中使用可等待对象。我错过了什么还是就是这样?

你没有错过任何东西,除了暂停能力的重要性。如果没有可挂起的魔法方法,上下文管理器和迭代器将无法用于异步工作。例如,常规文件对象用作从文件中生成行的迭代器。对于提供等效功能的异步文件对象(或流),它必须能够等待行的到来,从而暂停迭代它的协程。这同样适用于上下文管理器,其输入必须建立异步网络连接,依此类推。

[能够暂停执行]是指使用await调用协程吗?

使用awaitin anasync def是暂停执行的一种方法。另一种选择是让__aenter__etc. 成为返回自定义 awaitable 的普通函数,该函数实现了自己的__await__. PEP 492 从使用上下文管理器的代码的有利位置描述了功能,它必须准备好挂起它的魔法方法——async with必须在 an 中async def,并且它将await在适当的位置对 s 中的代码进行脱糖。

于 2019-11-06T07:32:32.297 回答