Этого легко достичь с помощью библиотеки aiostream . Вот рабочий пример:
import asyncio
from random import random
from aiostream import stream, pipe
async def some_async_task(i):
await asyncio.sleep(random())
return i if random() < 0.2 else None
async def process(task_args, n):
return await (
stream.iterate(task_args)
| pipe.map(some_async_task, task_limit=n)
| pipe.filter(bool)
| pipe.take(n)
| pipe.list()
)
async def main():
print(await process(task_args=range(100), n=10))
if __name__ == "__main__":
asyncio.run(main())
Программа печатает список первых 10 успешно выполненных задач:
[1, 8, 16, 18, 19, 37, 42, 43, 45, 47]
Также обратите внимание, что вы можете настроить число some_async_task
, котороеможет выполняться одновременно с использованием аргумента task_limit
.
Отказ от ответственности: я сопровождающий проекта.