Scala Async 库

jonah1347 8年前

来自: http://colobu.com/2016/02/15/Scala-Async/

在我以前的文章中,我介绍了 Scala Future and Promise 。 Future 代表一个异步计算,你可以设置你的回调函数或者利用 Await.result 等待获取异步计算的结果,你还可以组合多个 future 为一个新的 future 。 Promise 让你可以控制是否完成计算还是抛出异常,它的 future 方法返回一个 Future 对象, complete 、 success 和 failure 允许你完成计算。如果想要同步操作,可以使用 Await.result 等待 Future 完成或者超时,对于没有实现 Awaitable 的代码块,可以使用 blocking 方法实现同步执行。

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

async 用来标记一块异步执行的代码,通常这块代码中包含包含一个或者多个 await 调用。如果没有 await 调用,我们用 future 方法就可以了。

这样,对于复杂的异步代码,你不必使用 map 、 flatMap 或者回调来实现复杂的多层的调用嵌套。

importExecutionContext.Implicits.global  importscala.async.Async.{async, await}    valfuture = async {  valf1 = async { ...;true}  valf2 = async { ...;42}  if(await(f1)) await(f2)else0  }

比如下面的代码,我们使用纯 future 实现:

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

如果使用 async/await ,代码将得到简化。

defcombined: Future[Int] = async {  valfuture1 = slowCalcFuture  valfuture2 = slowCalcFuture   await(future1) + await(future2)  }

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

</div>