0
0

Scala Async 库

鸟窝 发表于 2016年02月15日 16:45 | Hits: 2126
Tag: Scala

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

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

async用来标记一块异步执行的代码,通常这块代码中包含包含一个或者多个await调用。如果没有await调用,我们用future方法就可以了。
这样,对于复杂的异步代码,你不必使用map、flatMap或者回调来实现复杂的多层的调用嵌套。

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

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

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

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

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

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

转载请注明文章来源: colobu.com

原文链接: http://colobu.com/2016/02/15/Scala-Async/

0     0

我要给这篇文章打分:

可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.

评价列表(0)