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())