ESC
科技 1 分钟阅读

Async/Await 设计空间探索:九大设计维度解析

一项关于异步编程设计空间的研究提出,"热启动"与"冷启动"属于"Eagerness"设计维度,并从现代 async/await 实现中归纳出九个设计维度,按任务生命周期分为生命起点、生命终点与取消三类,横向比较了 C#、Swift、JavaScript、Tokio、Smol、Asyncio、Trio 等实现的语义差异,帮助开发者理解各语言异步设计的取舍。

来源:Hacker News

在观看一位编程领域影响者的视频时,你可能听过"冷"或"热"async 函数调用这两个术语。其含义是:“热启动"返回的任务会立即在 runtime 中开始运行,而"冷启动"返回的则是一个惰性对象,在被 await 之前什么也不做。

热函数与冷函数之别,就是我们所说的异步设计维度:一种影响程序执行可观测语义的设计决策(与纯粹的性能问题相对)。我们将这个特定维度称为"Eagerness”(急切性),并且在论文中,我们从现代直线式异步(straight-line asynchrony)实现中识别出了九个这样的维度。下面我们将这九个维度归入三大类别,大致对应一个任务的生命周期:生命起点、生命终点与取消。

点击某种语言,即可在表格中追踪它的设计选择。

如何对一个 async 函数调用进行求值。

求值为一个 coroutine(协程),而不再进一步执行。

在当前线程中求值,并在 await 时调度为任务。

关于 await 点是否挂起的保证。

C# · Swift · Tokio · Smol · Asyncio · Trio

任务默认可以存在的时间区间。

默认情况下,任务可以一直存在到 runtime 结束。

默认情况下,任务可以一直存在到其派生作用域结束。

[针对 Indefinite Extent] runtime 所持有的、指向任务的引用类型。

任务在其存在期结束时如何被清理。

任务先被取消,随后可能被 await。

未被 await 的任务中发生的异常如何处理。

JavaScript · C# · Tokio · Smol · Asyncio · Swift

任务是否能够响应取消。

任务无法响应取消。

取消如何通过任务图进行传递。

从根任务开始,由依赖方传递给被依赖方。

从根任务的被依赖方开始,传递给依赖方。

[针对 Aware Cancellation] 对一个任务的取消会持续多长时间。