asyncio.gather с выражением генератора - PullRequest
0 голосов
/ 18 июня 2020

Почему 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())

Второй вариант дает:

[...]
  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>

Это ожидаемое поведение?

1 Ответ

1 голос
/ 18 июня 2020
await asyncio.gather(func() for x in range(3))

Это не работает, потому что он передает объект генератора в качестве аргумента для gather. gather не ожидает итеративного , он ожидает сопрограммы как отдельные аргументы. Значит, генератор нужно распаковать.

...