【问题标题】:What's the relationship between the async/await pattern and continuations?异步/等待模式和延续之间的关系是什么?
【发布时间】:2014-05-14 02:27:54
【问题描述】:

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

  • async/await 模式是成熟延续的有限子集吗? (如果属实,延续如何更具表现力?)
  • 延续只是async/await 的一种可能实现技术吗? (如果属实,还有哪些其他实现方法?)
  • 或者async/await 和延续只是正交概念,唯一的共同点是它们都支持控制流/数据流的某种抽象?

【问题讨论】:

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


【解决方案1】:

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

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

async/await 模式是成熟延续的有限子集吗? (如果为真,延续如何更具表现力?)

你可以这么说。延续是一个更笼统的概念,async-await只是用它们来实现异步。

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

延续只是async/await 的一种可能实现技术吗? (如果属实,还有哪些其他实现方法?)

我想说的是,延续的概念对于async-await 来说非常重要。

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

【讨论】:

  • 另外,ContinueWith 可以恢复异步方法。例如,对于原始线程,这是不可能的,因为当它退出时您无法被回调。你只能等待。
  • 虽然,延续不一定是异步执行。另一个例子是yield,其最初目的与异步无关。
  • @Noseratio 是的,这就是我一直想说的一部分。
  • @svick。感谢您的回答!您能否评论一下 async/await 如何使用延续? (例如,它只是挂在下面的 shift/reset 中还是发生了更多的魔法?)
  • @soc 我认为async-await 与分隔延续无关,它只是使用普通延续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2016-12-07
  • 1970-01-01
  • 2021-11-07
  • 2018-03-04
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多