异步生成器理解

Async Generator Comprehension

需求是并发执行一个列表数据的耗时操作。

我当前的实现:

async def expensive_routine(service) -> Optional[Any]:
    await asyncio.sleep(5)
    if service % 2:
        return service
    return None

async def producer():
    # let's say
    services = range(10)
    #
    for future in asyncio.as_completed(
            [expensive_routine(service) for service in services]
        ):
            result = await future
            if result:
                yield result

随后被以下人员使用:

  async for x, y in producer():
        print(f"I have my {x} and {y}")

函数 expensive_routine returns Optional[Any]。我只想产生非 None 结果。 有没有办法更有效地执行此操作或使用 Comprehension?

你的意思是,如果你可以将你漂亮的小 producer 协程塞进一个 single-line 生成器表达式中,这令人厌恶,难以阅读?为什么,是的!

import asyncio
import random


async def expensive_routine(service):
    await asyncio.sleep(random.randint(0, 5))
    if random.choice([0, 1]):
        return service
    return None


async def main():
    async for x in (
        res
        for coro in asyncio.as_completed(
            [expensive_routine(service) for service in range(10)]
        )
        if (res := (await coro)) # Python 3.8+
    ):
        print(x)


asyncio.run(main())

开个玩笑,我没发现你的代码有什么问题,我不确定你所说的更高效是什么意思,因为你这里的速度主要是慢 expensive_routine.

我写了这个小例子,因为我认为这就是你理解的意思,但我更希望你的可读性更高 producer