异步/等待模式与延续之间的关系是什么?

时间:2014-04-02 16:33:26

标签: asynchronous concurrency async-await continuations delimited-continuations

我想知道async / await模式(从Scala,F#,C#等已知)与延续之间的关系是什么:

  • async / await模式是完整延续的有限子集吗? (如果是真的,那么延续更具表现力?)
  • 延续只是async / await的一种可能的实施方法吗? (如果是,那么还有其他实施方法吗?)
  • async / await和延续只是正交概念,唯一的共同点是它们都能实现控制流/数据流的抽象?

1 个答案:

答案 0 :(得分:4)

我想说两者之间的关系是这样的:async - await是一种编程语言使用的技术,这样你就可以编写看起来同步的代码(例如没有明确的连续代理),但是这实际上是异步执行的。这是通过创建一个对象来实现的,该对象表示函数的当前执行状态,并将其注册为等待操作的 continuation

简而言之,async - await 使用延续。

  

async / await模式是完整延续的有限子集吗? (如果是真的,那么延续更具表现力?)

你可以这么说。 Continuations是一个更通用的概念,async - await只是使用它们来实现异步。

例如,在continuation-passing style编程中,您可以通过为每个操作设置两个延续来实现异常处理:一个用于成功案例,一个用于失败案例。对continuation的使用与async - await无关(你必须明确地编写每个continuation,可能作为lambda)。

  

延续只是async / await的一种可能的实施技巧吗? (如果是,那么还有其他实施方法吗?)

我说延续的概念对async - await非常重要。

async - await的核心思想是暂时停止执行该功能,并在以后恢复它。为此,您需要某种可用于恢复的对象。这正是延续的原因。