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)
这是预期的行为吗?
await asyncio.gather(func() for x in range(3))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为这是将生成器对象作为参数传递给gather. gather不需要 iterable ,它需要协程作为单独的参数。这意味着您需要拆开发电机的包装。