2013-04-11 103 views
9

阻塞調用的Akka文件說:期貨在斯卡拉

你可能受到誘惑,只是包裝一個未來幾年內的阻塞調用,並與替代工作,但這個策略是太簡單了:你很容易當應用程序在增加的負載下運行時發現瓶頸或耗盡內存或線程。

他們提出以下策略:

  • 做一個Future內的阻塞調用,確保對此類電話的數量上限在任何時間點(提交的這個任務無限多個自然會耗盡你的記憶或線程限制)。

  • Future內部執行阻塞調用,爲線程池提供適用於運行該應用程序的硬件的線程數上限。

你知道這些策略的實施嗎?

回答

16

期貨在execution contexts之內運行。從Future API中可以看出這一點:任何涉及將未來回調附加回調或從任意計算或未來未來構建未來的調用都需要隱式提供對象。因此,您可以通過調整它們運行的​​ExecutionContext來控制期貨的併發設置。

例如,爲了實現你可以這樣做

import scala.concurrent.ExecutionContext 
import java.util.concurrent.Executors 
import scala.concurrent.future 

object Main extends App { 

    val ThreadCount = 10 
    implicit val executionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(ThreadCount)) 

    val f = future { 
    println(s"Hello ! I'm running in an execution context with $ThreadCount threads") 
    } 

} 
+0

謝謝,但它看起來太Java。我正在尋找更多的「斯卡拉 - 伊斯」方法。 – Michael 2013-04-11 15:24:44

+6

那麼,我認爲它不會比'scala.concurrent'庫更多的Scala-ish。 – 2013-04-11 15:48:53

+0

此外,它不會再比http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.concurrent.ExecutionContext – axiopisty 2014-05-29 15:51:47

2

阿卡本身實現這一切的第二個策略,你可以用你的阻塞調用到演員,然後用dispatchers控制執行的線程池。

+0

要補充這一點,請不要使用ActorSystem的默認調度程序執行包含阻塞調用的Futures,否則會爲Actor實例創建一個瓶頸。分配專用於執行這些阻止代碼的單獨的ExecutionContext會更好。 – lolski 2015-06-23 08:35:33