2014-01-21 44 views
7

當我製作future或應用方法如onSuccessmap時,我可以爲它們指定ExecutionContext。Scala:用於將來理解的ExecutionContext

例如,

val f = future { 
    // code 
} executionContext 

f.map(someFunction)(executionContext) 

f onSuccess { 
    // code 
} executionContext 

但是,如果我用一個換理解未來的,我怎麼能爲yield部分指定的ExecutionContext?

for { 
    f <- future1 
    g <- future2 
} yield { 
    // code to be executed after future1 onSuccess and future2 onSuccess 
    // What ExecutionContext runs this code? 
} // (executionContext) here does not work 

而且,如果沒有指定,ExecutionContext在yield中運行代碼?


編輯

確定。感謝答案,我找到了一些東西。
如果我沒有定義或導入隱含的ExecutionContext(如Implicits.global), 的換理解不編譯。這意味着,for-comprehension使用隱式的ExecutionContext。

然後,我該如何使用不含隱式ExecutionContext的理解,即如何指定?

+0

請參閱我的回答,瞭解爲什麼如果您沒有指定「隱式」,for'comprehensions將無法編譯。 –

+0

@flavian在簡單的情況下,這是有效的。但是如果有兩個ExecutionContext用於理解,我該如何指定?它會顯示錯誤,如「含糊的隱含值」。我可以阻止每次我定義或導入隱式vals或defs&for-comprehension,但有沒有另一種方式? – Naetmul

+0

只是要絕對確定 - 你的意思是用多個生成器(在這種情況下,flavian的答案是有效的)還是多個相應的for-comprehensions一個'for for'-理解? –

回答

8

ExecutionContext參數實際上是implicit。這意味着您可以:

import scala.concurrent.ExecutionContext 

implicit val context = ExecutionContext.fromExecutor(//etc) 
for { 
    f <- future1 
    g <- future2 
} yield { 
    // code to be executed after future1 onSuccess and future2 onSuccess 
    // What ExecutionContext runs this code?: the one above. 
} 

您還有一個默認值,即scala.concurrent.ExecutionContext.Implicits.global。 這與運行機器上的處理器具有儘可能多的線程。

默認情況下,它不會被所有期貨使用,您仍然需要導入它。

更新:如果你真的想specifiy,儘管它不建議,您可以解開的for yield

val combined = futureA.flatMap(x => futureB)(context) 
+0

如果在作用域中有兩個隱式ExecutionContext並且您需要選擇一個呢? – kostya

+1

@kostya你可以使用像這樣的選擇性別名:'import com.bla.bla。{contextToDiscard => _,_}'。如果它是導致問題的軟件包導入,那麼只會將其中一個導入範圍。另一種方法是將導入執行者的進口移至較低的範圍。 – flavian

1

由於for內涵是「映射」到map/flatMap操作和ExecutionContext參數這些都是隱含的,我想你可以嘗試在本地範圍內添加一個implicit val

implicit val myContext:ExecutionContext = ...

我不相信有一個「默認」隱含ExecutionContext,但最常用的是ExecutionContext.Implicits.global