eager_task_factory 不是 Python 3.12 的标准特性,CPython 3.12 的 asyncio 中根本不存在该功能;它可能源于第三方库、未合并提案或对 create_task() 行为的误读。

eager_task_factory 不是 Python 3.12 的标准特性,它根本不存在于 CPython 3.12 的 asyncio 实现中。你可能混淆了几个概念:第三方库(如 anyio)、未合并的提案、或对 asyncio.Task 初始化机制的误读。
如果你在某处看到 eager_task_factory,大概率是以下情况之一:
- 某个自定义运行时(如 uvloop 的实验分支)临时添加的调试钩子
- 第三方异步库(例如早期
trio或curio衍生项目)的内部命名 - 对
asyncio.create_task()的参数名或行为的错误记忆(该函数没有叫这个名字的参数)
asyncio.create_task() 在 Python 3.12 中的真实行为
Python 3.12 继续沿用 3.11 引入的 asyncio.TaskGroup 和优化后的任务调度路径,但 没有新增任何公开的 task factory 配置点。create_task() 的签名仍是:
asyncio.create_task(coro, *, name=None, context=None)
-
coro会被立即包装为Task对象 - 该
Task不会立刻执行,而是被放入事件循环的就绪队列,等待下一轮循环调度 - 所有任务调度仍受事件循环控制,不存在“eager”(急切)启动模式
真正影响任务启动性能的关键点
如果你的目标是「让协程更快开始执行」,应关注这些实际可控项:
立即学习“Python免费学习笔记(深入)”;
-
asyncio.run()启动开销:每次调用都会新建事件循环,适合顶层入口;高频短任务别反复调用 -
asyncio.TaskGroup的批量创建效率:比多次create_task()更轻量,尤其在异常传播和生命周期管理上 - 事件循环实现:CPython 默认
asyncio.SelectorEventLoop;生产环境建议换用uvloop(可提速 2–3 倍) - 协程本身是否含阻塞操作:比如同步文件 I/O、CPU 密集型计算——这类代码会拖慢整个事件循环,必须用
loop.run_in_executor()脱离主线程
容易踩的坑
- 把
create_task()当作“立刻并发执行”的保证:它只是注册任务,不改变调度顺序 - 在非事件循环线程里直接调用
create_task():会报RuntimeError: no running event loop - 误以为
contextvars.Context参数能加速任务:它只用于变量隔离,与性能无关 - 试图 monkey patch
asyncio.Task.<strong>init</strong>来注入“eager”逻辑:CPython 3.12 的Task是用 C 实现的,Python 层覆盖无效
真正想压榨 asyncio 性能,重点不在虚构的 factory,而在减少上下文切换、避免阻塞、选对事件循环实现。



















