8

我参加了一个非常有趣的关于异步(https://github.com/scala/async)的讲座,这是一个新的 Scala 库,我不确定 Akka 和 Async 有何不同。

我是 Scala 的新手,如果答案很明显,我深表歉意。

谢谢。

4

2 回答 2

19

Async 简化了异步和并发编程。异步支持以熟悉的直接风格使用非阻塞 API 进行编程。直接式代码与编写阻塞代码一样简单,但它具有高效非阻塞代码的所有优点。

开箱即用的 Async 使使用Scala 的future 进行编程更加方便。事实上,通过将 Async 与 futures 结合使用,您易于阅读的直接式代码在后台转换为高效的非阻塞代码。异步也可以连接到其他 API(见下文)。

Akka 提供了一个编程模型和运行时来简化并发、分布和容错。Async 不提供运行时——它使现有的抽象及其运行时更易于使用。但是,Async 和 Akka 可以通过以下几种重要方式协同工作:

  1. 使用 Akka 的“询问”模式,使用“?”发送消息 返回一个未来。异步使处理这些期货变得容易。

  2. Async 可以连接到除Scala 的 Futures API 之外的 API。这开辟了利用 Async 简化 Akka Actor 编程的有趣方法。这是我们将在不久的将来在Typesafe探索的一个领域。

  3. Async 是Akka 的数据流 API的替代品,它更简单、更健壮。异步更简单,因为它不会引入源自使用 Scala 的 CPS 插件的复杂类型。Async 更健壮,因为它与 CPS/Akka 的数据流 API 不完全支持的模式匹配和 try-catch 等功能一起工作得很好。此外,它明确规定了不能使用异步的地方(await不能出现在闭包、嵌套类/特征/对象或按名称参数中)。

有关更多 Async 示例和文档,请参阅我最近关于 Async的演讲和Async 项目网站上的文档。

于 2013-06-07T16:48:38.747 回答
6

Async 只是为使用 Future 添加了有用的 API(以及其他一些好的内部东西),与 Actor 模型无关,而 Akka 是一个使用 Actors 创建大规模分布式的框架。它们有不同的用例,没有任何共同点。将 Async 与 Scala/Akka Futures API 进行比较更正确。我对异步没有太多经验,但要点是你有两个构造asyncawait. Async标记包含一个或多个await调用的异步代码块,这标志着计算将暂停的点,直到等待的 Future 完成。可以将此类 API 与使用map和的标准方式进行比较flatmap

使用标准 API(构造转换为map和的组合flatmap):

def slowCalcFuture: Future[Int] = ...
val future1 = slowCalcFuture
val future2 = slowCalcFuture
def combined: Future[Int] = for {
  r1 <- future1
  r2 <- future2
} yield r1 + r2

和异步:

def slowCalcFuture: Future[Int] = ...
def combined: Future[Int] = async {
  val future1 = slowCalcFuture
  val future2 = slowCalcFuture
  await(future1) + await(future2)
}
于 2013-06-06T10:10:48.463 回答