[转] Scala Async 库 (Scala future, await, async)

[From] https://colobu.com/2016/02/15/Scala-Async/html

 

在我之前的文章中,我介绍了Scala Future and PromiseFuture表明一个异步计算,你能够设置你的回调函数或者利用Await.result等待获取异步计算的结果,你还能够组合多个future为一个新的futurePromise让你能够控制是否完成计算仍是抛出异常,它的future方法返回一个Future对象,completesuccessfailure容许你完成计算。若是想要同步操做,能够使用Await.result等待Future完成或者超时,对于没有实现Awaitable的代码块,能够使用blocking方法实现同步执行。
框架

以上是对上一篇文章的总结。Scala官方还提供了一个Async库,用来简化Scala异步操做,尽管这个库尚未正式加入到Scala的标准库中。它是经过Scala macro特性实现的。异步

async用来标记一块异步执行的代码,一般这块代码中包含包含一个或者多个await调用。若是没有await调用,咱们用future方法就能够了。
这样,对于复杂的异步代码,你没必要使用mapflatMap或者回调来实现复杂的多层的调用嵌套。async

import ExecutionContext.Implicits.global
import scala.async.Async.{async, await}
val future = async {
  val f1 = async { ...; true }
  val f2 = async { ...; 42 }
  if (await(f1)) await(f2) else 0
}

 

好比下面的代码,咱们使用纯future实现:函数

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

 

若是使用async/await, 代码将获得简化。spa

def slowCalcFuture: Future[Int] = async {
  val future1 = slowCalcFuture
  val future2 = slowCalcFuture
  await(future1) + await(future2)
}

 

事实上,这个框架是SIP-22 - Async的参考实现。这个Scala特性提议发布于2013年。scala

相关文章
相关标签/搜索