转载

Scala Async 库

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

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

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

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

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 

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

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

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

原文  http://colobu.com/2016/02/15/Scala-Async/
正文到此结束
Loading...