A straightforward approach:
async def main(): tasks: list[Coroutine] = create_tasks() max_con = 16 while tasks: todo, tasks = tasks[:max_con], tasks[max_con:] await asyncio.gather(*todo) asyncio.run(main())