Как запустить список задач за X раз? И подождите, пока каждая группа закончит

У меня есть группа из 1000 задач.

import asyncio

async def my_task(x):
    await asyncio.sleep(0.1)
    print(f"done: {x}")


async def main():
    my_tasks = []
    for x in range(1000):
        my_tasks.append(lambda: my_task)         

    # ???
    # how to scoop up the consequent 10 out of `my_tasks`
    # to execute them asyncronously?
    # and then wait for them?
    # 

    # ??
    # asyncio.create_task(my_task())
    # pending = asyncio.all_tasks()
    # group = asyncio.gather(*pending, return_exceptions=True)
    # await group

Я хочу запускать их 10 на 10. То есть по 10 за раз. Затем дождитесь их (10) окончания и только после этого запускайте еще 10 и так далее.

Как это сделать?

🤔 А знаете ли вы, что...
Python поддерживает динамическую типизацию, что облегчает разработку.


50
1

Ответ:

Решено

Вы можете добиться этого, используя asyncio.gather для одновременного запуска задач в группах по 10. Вот пример того, как вы можете изменить свою основную функцию для достижения этой цели:

import asyncio

async def my_task(x):
    await asyncio.sleep(0.1)
    print(f"done: {x}")

async def main():
    my_tasks = [my_task(x) for x in range(1000)]

    # Run tasks in groups of 10
    for i in range(0, len(my_tasks), 10):
        group = my_tasks[i:i+10]
        await asyncio.gather(*group)

asyncio.run(main())

Этот код создает список из 1000 задач, а затем перебирает его с шагом 10. Для каждой группы из 10 задач он использует asyncio.gather для их одновременного запуска и ждет их завершения, прежде чем перейти к следующей группе.

Примечание. В некоторых редакторах кода Python (например, в блокнотах Google Colab) следует использовать await main() вместо asyncio.run(main()).