我有下一個代碼:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main extends App {
println("Hello, World!")
val fut = Future { Thread.sleep(10000); 21 21 }
while (!fut.isCompleted)
{}
println(fut.value)
}
使用 Await 代替 while 回圈有什么好處?使用while回圈更好嗎?為什么?
我正在嘗試了解 Scala Futures
謝謝
uj5u.com熱心網友回復:
Await應該比while回圈占用更少的 CPU 。
大多數 Futures 的實作最終將使用def tryAwaitfromPromise,您可以看到它正在使用CompletionLatch,它在幕后使用一些低級執行緒同步功能,以便它實際上可以停止呼叫執行緒直到閂鎖被釋放。同時,您的 CPU 可以執行其他操作并“忽略”該執行緒。
與之相反的是while (!fut.isCompleted),它只會花費每個可能的 CPU 周期來運行該檢查。
但是,正如@gatear 已經提到的,您通常永遠不會呼叫Await.ready(...). 通常,您會將一些行為附加到未來,以便在結果可用時它會運行(即讓 Future 告訴事情已準備就緒,而不是像坐在汽車后座上的孩子一樣,不斷詢問“我們到了嗎? ?”)。例如:
val loadGoogleHtml: Future[String] = /* ... */
loadGoogleHtml.onComplete {
case Success(html) => println(s"loaded google.com --\n$html")
case Failure(err) => err.printStackTrace()
}
或者您可以創建一個新的 Future,將一些后處理應用于第一個 Future,例如
val loadGoogleHtmlAsXml: Future[XML] = {
loadGoogleHtml.map { rawHtml => parseRawXml(rawHtml) }
}
該點使用未來是來幫助你,當你有一定的價值,這將最終面市,其中(例如,像一個遠程服務器,或者某個被一個單獨的執行緒或執行緒池運行一個長時間的計算通訊一些IO操作)該結果通過回呼函式傳達;Future 是一種與基于回呼的設計互動的更好方式。
uj5u.com熱心網友回復:
在 Scala 中使用異步代碼,您可能會與一個框架進行互動,該框架將接受或給您一個Future[T].
在 prod 環境中,不要為 Future 等待一段時間。
如果您確實需要這樣做,請使用Await:
import scala.concurrent.duration._
Await.result(fut, 1 minute) //will return the result
Await.ready(fut, 1 minute) //or just await for completion
兩個塊,但關于你的問題,這里是 Scala 檔案的一個片段:
雖然這個方法是阻塞的,但 [[scala.concurrent.blocking blocks]] 的內部使用確保底層 [[ExecutionContext]] 有機會正確管理阻塞。
要了解一些現實生活中的用例,您可以在Play Framework 中定義異步操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372704.html
標籤:斯卡拉
