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