如何一次运行X中的任务列表?并等待每组结束

问题描述 投票:0回答:1

我有一组 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 x 10. 即一次运行 10 个。然后等待它们 (10) 完成,然后再运行另外 10 个,依此类推。

怎么做?

python asynchronous parallel-processing python-asyncio
1个回答
0
投票

您可以通过使用 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 notebooks)中,您应该使用

await main()
而不是
asyncio.run(main())

© www.soinside.com 2019 - 2024. All rights reserved.