如何为 async.gather 动态构建协程列表?

how to dynamically build a list of coroutines for async.gather?

documentation,我们有:

async def main():
    await asyncio.gather(
      factorial("A", 2),
      factorial("B", 3),
      factorial("C", 4),
    )
asyncio.run(main())

如果我想让协程的数量成为main的参数,应该如何实现?我试过了

async def main(count):
    coroutines = [factorial(str(i),i) for i in range(count)]
    await asyncio.gather(coroutines)
asyncio.run(main(3))

但得到了:

TypeError: unhashable type: 'list'
sys:1: RuntimeWarning: coroutine 'factorial' was never awaited

看看第一个例子中你是如何调用 asyncio.gather 的:

await asyncio.gather(factorial("A", 2), factorial("B", 3), factorial("C", 4))

您正在传递三个参数。但是在你的第二个例子中,你是 尝试传入单个参数(协程列表):

await asyncio.gather(coroutines)

这不是一个等效调用。 asyncio.gather 不期望任何 它的参数是一个列表,这就是你得到它的原因 “unhashable type”错误消息(它试图将参数用作 字典键或其他一些需要可哈希的操作 值)。

等效调用为:

await asyncio.gather(*coroutines)

* 运算符将列表“解包”为多个参数。

相关文档为here