【问题标题】:How to use await inside map function如何在地图功能中使用等待
【发布时间】:2020-10-31 22:19:16
【问题描述】:

我有以下代码

async def foo():
   some_tuple = tuple(map(bar, some_tuple))
async def bar(data):
   # Await another function and do some other stuff
   return something

由于bar 是异步的,因此必须等待。但是,我不确定在哪里等待bar。我尝试在 map 中等待它,我尝试等待 map,我尝试等待 tuple,但没有任何效果。

我如何在map 中等待bar

【问题讨论】:

  • @Belegnar 这个问题与您指出的问题有关,但并不是真正的重复。在较早的问题中,发布者知道如何编写 map 的异步版本,但面临当时 Python 中缺乏异步生成器的问题。答案集中在(现在已经过时)在没有异步生成器的情况下实现异步迭代器的方法上,这不是这里的 OP 所需要的。

标签: python-3.x python-asyncio


【解决方案1】:

您不能将map 与异步函数一起使用,因为 map 是同步的并且不会在循环内暂停执行。这同样适用于需要同步生成器的 tuple 构造函数。

Ti 解决了这个问题,您可以将 map/tuple 对替换为列表解析,它可以是异步的,并且很容易转换为元组:

some_tuple = tuple([await fn(elem) for elem in iterable])

另一种选择是使用 asyncstdlib 包中的 maptuple 的异步版本,它还提供了许多附加和有用的功能:

import asyncstdlib.builtins.map as amap
import asyncstdlib.builtins.tuple as atuple

some_tuple = await atuple(amap(fn, iterable))

【讨论】:

  • 我尝试了所有 3 种方法,每种方法都得到了TypeError: 'async_generator' object is not iterable。抱歉,我是 Python 异步的新手。
  • @SarmaEater 是的,问题是tuple 也是非异步的。我现在修改了答案。
猜你喜欢
  • 2020-07-01
  • 2021-03-19
  • 2018-03-30
  • 1970-01-01
  • 2020-02-15
  • 2020-02-18
  • 2018-10-28
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多