Akka和Async如何区别

时间:2013-06-06 10:05:34

标签: scala asynchronous jvm akka

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

我是Scala的新手,如果答案显而易见,请道歉。

感谢。

2 个答案:

答案 0 :(得分:19)

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

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

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

  1. 使用Akka的“ask”模式,使用“?”发送消息回归未来。 Async可以轻松处理这些未来。

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

  3. Async是Akka's dataflow API的替代品,它更简单,更强大。异步更简单,因为它不会引入源自Scala的CPS插件的复杂类型。 Async更加健壮,因为它与模式匹配和try-catch等功能很好地配合,而CPS / Akka的数据流API并不完全支持这些功能。此外,明确指出了无法使用Async的地方(await不能出现在闭包,嵌套类/特征/对象或名字参数中。

  4. 有关更多异步示例和文档,请参阅我最近的talk on Async以及Async project website上的文档。

答案 1 :(得分:5)

Async只是添加了有用的API(和其他一些好的内部事物)来处理Future并且与Actor模型无关,而Akka是一个用Actors创建大量分布的框架。它们有不同的用例,没有任何共同之处。将Async与Scala / Akka Futures API进行比较更为正确。我对Async没有多少经验,但重点是,你有两个结构asyncawaitAsync标记了一个包含一个或多个await调用的异步代码块,它标记了计算将暂停的点,直到等待的Future完成为止。可以将此类API与使用mapflatmap的标准方式进行比较。

使用标准API(用于构建转换为mapflatmap的组合):

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)
}