https://docs.python.org/zh-cn/3.13/library/asyncio-task.html#eager-task-factory

这是 python 3.12 新增的 feature。

文档里说的比较抽象,看这个对比代码,就比较直观。

在 main_normal 里,代码运行的流程是,先为协程 A 和 协程 B 创建 task,然后到下一个 loop iter,协程 A 和协程 B 才会开始执行。

在 main_eager 里,代码运行的流程是,先为协程 A 创建 task,然后协程 A 立即开始执行,直到遇到第一个 await 语句,然后返回 main_eager 函数,为协程 B 创建 task,同样的,B 也立即开始执行,直到遇到第一个 await 语句。剩下的就都一样了。

import asyncio
from functools import partial

async def coroutine_A():
    print("Coroutine A starts")
    # 假设这里没有 await,协程 A 会立即执行
    await asyncio.sleep(1)  # 遇到 await,事件循环挂起协程 A

async def coroutine_B():
    print("Coroutine B starts")
    # 假设这里没有 await,协程 B 会立即执行
    await asyncio.sleep(1)  # 遇到 await,事件循环挂起协程 B

async def main_normal():
    # task_factory = partial(asyncio.eager_task_factory, asyncio.get_running_loop())
    task_factory = asyncio.create_task

    # 使用 eager_task_factory 为协程 A 创建任务
    task_A = task_factory(coroutine_A())
    print("After creating task A")

    # 使用 eager_task_factory 为协程 B 创建任务
    task_B = task_factory(coroutine_B())
    print("After creating task B")

    await task_A
    await task_B

async def main_eager():
    task_factory = partial(asyncio.eager_task_factory, asyncio.get_running_loop())
    # task_factory = asyncio.create_task

    # 使用 eager_task_factory 为协程 A 创建任务
    task_A = task_factory(coroutine_A())
    print("After creating task A")

    # 使用 eager_task_factory 为协程 B 创建任务
    task_B = task_factory(coroutine_B())
    print("After creating task B")

    await task_A
    await task_B

print("normal create_task")
asyncio.run(main_normal())
print("\\nuse eager task factory")
asyncio.run(main_eager())