如何为 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。
在 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。