[轉] Scala Async 庫 (Scala future, await, async)


[From] https://colobu.com/2016/02/15/Scala-Async/

 

在我以前的文章中,我介紹了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或者回調來實現復雜的多層的調用嵌套。

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, 代碼將得到簡化。

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

 

事實上,這個框架是SIP-22 - Async的參考實現。這個Scala特性提議發布於2013年。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM