异步生成器理解
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
。
需求是并发执行一个列表数据的耗时操作。
我当前的实现:
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
。