Scala Async 庫

jonah1347 8年前發布 | 32K 次閱讀 Scala Scala開發

來自: http://colobu.com/2016/02/15/Scala-Async/

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

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年。

 本文由用戶 jonah1347 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!