[From] https://colobu.com/2016/02/15/Scala-Async/html
在我之前的文章中,我介绍了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
或者回调来实现复杂的多层的调用嵌套。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