asyncio.gather 与生成器表达式

Mar*_*ark 5 python python-asyncio

为什么 asyncio.gather 不能与生成器表达式一起使用?

import asyncio

async def func():
    await asyncio.sleep(2)

# Works
async def call3():
    x = (func() for x in range(3))
    await asyncio.gather(*x)

# Doesn't work
async def call3():
    await asyncio.gather(func() for x in range(3))

# Works
async def call3():
    await asyncio.gather(*[func() for x in range(3)])

asyncio.run(call3())
Run Code Online (Sandbox Code Playgroud)

第二个变体给出:

[...]
  File "test.py", line 13, in <genexpr>
    await asyncio.gather(func() for x in range(3))
RuntimeError: Task got bad yield: <coroutine object func at 0x10421dc20>
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

dec*_*eze 5

await asyncio.gather(func() for x in range(3))
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为这是将生成器对象作为参数传递给gather. gather不需要 iterable 它需要协程作为单独的参数。这意味着您需要拆开发电机的包装。