async/await 的设计空间:同一个程序,七种运行时给出四种答案
来源: cel.cs.brown.edu — 2026-09-08
概述
布朗大学 Gavin Gray 等人的论文《A Design Space Exploration of Async/Await》指出,各语言的 async/await 差异比想象中大得多。他们用一个「在后台写日志」的极简程序测试七个现代异步运行时,得到四种不同输出,而且在三种变体下没有任何两个运行时结果一致。论文从现代实现里提炼出九个设计维度,分属任务生命周期的开始、结束与取消三个阶段,并把设计空间形式化为核心演算上的语义,用来逐步解释同一段程序为何分叉。
核心要点
- Eagerness:冷启动返回惰性协程(Python、Rust),还是热启动、立刻在当前线程求值(C#、JavaScript)。
- Extent 决定任务能活多久:JavaScript/C# 可活到运行时结束,Swift/Trio 只能活到生成它的作用域结束。
- Swift 在作用域结束时取消任务(打印 AC),Trio 则礼貌地等待它跑完(打印 ABC)。
- Destruction 有 awaited、cancelled、terminated 三种,C# 干脆由程序退出来终止任务。
- 取消本身也是多维度的:Rust 的任务无法感知取消,而 Asyncio、Trio、Swift 可以。
金句
一段全部工作只是在后台写一行日志的程序,却有四种不同的输出。而且情况还会更糟。
👍 0
👎 0
返回 Lobsters 首页