【问题标题】:Seeking explanation of the advantages of async with/for寻求解释 async with/for 的优点
【发布时间】:2019-11-06 04:20:56
【问题描述】:

我是 asyncio 的新手。我最近遇到了 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 中,它说“异步上下文管理器是能够在其进入和退出方法中暂停执行的上下文管理器。”这是指使用await调用协程吗?

【问题讨论】:

    标签: python python-asyncio python-aiofiles


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您写道:“对于提供等效功能的异步文件对象(或流),它必须能够等待行的到来。”从“等待行来”部分来看,在我看来,异步文件对象将用于要读取的文件内容不存在/将在不确定的时间点添加到文件中的情况未来;如果我错了,请纠正我。
    • @D.Anderson 这是一个可能的用例,但这不是必需的,也不是我所指的。您可能需要到常规文件 IO 的异步接口,以支持从慢速设备(旋转磁盘、网络安装共享)读取文件,而不会阻塞事件循环。您在问题中提到的 aiofiles 正是这样一个库:它向普通文件 IO 公开了一个支持异步的接口。此外,异步文件对象只是一个示例,您还可以想象一个到套接字(流)的异步接口,在这种情况下,您肯定希望在等待数据到达时暂停。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多