在观看一位编程领域影响者的视频时,你可能听过"冷"或"热"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] 对一个任务的取消会持续多长时间。