簡體   English   中英

何時使用 Scala 期貨?

[英]When to use Scala Futures?

我是一名火花 Scala 程序員。 我有一個火花工作,它有完成整個工作的子任務。 我想用期貨來並行完成子任務。 完成整個工作后,我必須返回整個工作響應。

我聽說 scala Futures 是一旦主線程執行並停止,其余線程將被殺死,並且您將得到空響應。

我必須使用 Await.result 來收集結果。 但是所有的博客都告訴你應該避免 Await.result ,這是一種不好的做法。

在我的情況下,使用 Await.result 是否正確?

def computeParallel(): Future[String] = {
  val f1 = Future {  "ss" }
  val f2 = Future { "sss" }
  val f3 = Future { "ssss" }

  for {
    r1 <- f1
    r2 <- f2
    r3 <- f3
  } yield (r1 + r2 + r3)
} 

computeParallel().map(result => ???)



根據我的理解,我們必須在 Webservice 類型的應用程序中使用 Futures,它有一個始終運行且不會退出的進程。 但就我而言,一旦邏輯執行(scala 程序)完成,它將退出。

我可以使用期貨來解決我的問題嗎?

提前致謝

除非在特殊情況下,否則可能不建議在 Spark 中使用期貨,並且簡單地並行計算不是其中之一(為阻塞 I/O 提供非阻塞包裝器(例如向外部服務發出請求)很可能是唯一的特殊情況案子)。

請注意, Future不保證並行性(它們是否以及如何並行執行取決於它們運行的ExecutionContext ),只是異步。 此外,如果您在 Spark 轉換中生成計算性能期貨(即在執行程序上,而不是驅動程序上),則很可能不會有任何性能改進,因為 Spark 往往做得很好讓執行器上的核心保持忙碌,所有產生這些期貨所做的事情就是與 Spark 競爭核心。

從廣義上講,在組合並行抽象(如 Spark RDD/DStreams/Dataframes、actors 和 futures)時要非常小心:有很多潛在的雷區,這些組合可能會違反各種組件中的保證和/或約定。

還值得注意的是,Spark 對中間值的可序列化有要求,並且期貨通常不可序列化,因此 Spark 階段不能導致未來; 這意味着你基本上別無選擇,只能在一個階段產生的期貨上Await

如果您仍然想在 Spark 階段生成期貨(例如,將它們發布到 web 服務),最好使用Future.sequence將期貨折疊成一個,然后在上面Await (請注意,我沒有測試過這個想法:我假設有一個隱式CanBuildFrom[Iterator[Future[String]], String, Future[String]]可用):

def postString(s: String): Future[Unit] = ???

def postStringRDD(rdd: RDD[String]): RDD[String] = {
  rdd.mapPartitions { strings =>
    // since this is only get used for combining the futures in the Await, it's probably OK to use the implicit global execution context here
    implicit val ectx = ???
    Await.result(strings.map(postString))
  }
  rdd  // Pass through the original RDD
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM