[轉] 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

相關文章
相關標籤/搜索