我参加了一个非常有趣的讲座,关于Async(https://github.com/scala/async)一个新的Scala库,我不确定Akka和Async是如何不同的。
我是Scala的新手,如果答案显而易见,请道歉。
感谢。
答案 0 :(得分:19)
Async简化了异步和并发编程。 Async支持以熟悉的直接样式使用非阻塞API进行编程。直接式代码与阻塞代码一样简单,但它具有高效非阻塞代码的所有优点。
开箱即用,Async使编程Scala's futures更方便。实际上,通过将Async与future结合使用,您易于阅读的直接式代码将转换为高效的非阻塞代码。 Async也可以连接到其他API(见下文)。
Akka提供了编程模型和运行时,以简化并发,分发和容错。 Async不提供运行时 - 它使现有的抽象和它们的运行时更容易使用。但是,Async和Akka可以通过几种重要方式协同工作:
使用Akka的“ask”模式,使用“?”发送消息回归未来。 Async可以轻松处理这些未来。
异步可以连接到Scala's Futures API以外的API。这开辟了有趣的方法来利用Async来简化Akka actor的编程。这是我们将在不久的将来Typesafe探讨的一个领域。
Async是Akka's dataflow API的替代品,它更简单,更强大。异步更简单,因为它不会引入源自Scala的CPS插件的复杂类型。 Async更加健壮,因为它与模式匹配和try-catch等功能很好地配合,而CPS / Akka的数据流API并不完全支持这些功能。此外,明确指出了无法使用Async的地方(await
不能出现在闭包,嵌套类/特征/对象或名字参数中。
有关更多异步示例和文档,请参阅我最近的talk on Async以及Async project website上的文档。
答案 1 :(得分:5)
Async只是添加了有用的API(和其他一些好的内部事物)来处理Future并且与Actor模型无关,而Akka是一个用Actors创建大量分布的框架。它们有不同的用例,没有任何共同之处。将Async与Scala / Akka Futures API进行比较更为正确。我对Async没有多少经验,但重点是,你有两个结构async
和await
。 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)
}