代码之家  ›  专栏  ›  技术社区  ›  gabriel119435

如何为async动态构建协同路由列表。聚集

  •  0
  • gabriel119435  · 技术社区  · 3 年前

    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
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   larsks    3 年前

    看看你打电话的方式 asyncio.gather 在第一个例子中:

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

    你传递了三个论点。但在你的第二个例子中,你是 尝试传入单个参数(一系列协同路由):

    await asyncio.gather(coroutines)
    

    这不是一个同等的电话。 asyncio。聚集 不指望有任何 它的论点是一个列表,这就是为什么你会得到它 “unhashable type”错误消息(尝试将参数用作 字典键或其他需要哈希表的操作 价值)。

    类似的呼吁是:

    await asyncio.gather(*coroutines)
    

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

    相关文件如下: here .