質問
私は利用しようと、世界からはみ出(通称フォーク/join)アプローチを延の問題です。こちらのコード:
import scala.actors.Futures.future
private def compute( input: Input ):Result = {
if( pairs.size < SIZE_LIMIT ) {
computeSequential()
} else {
val (input1,input2) = input.split
val f1 = future( compute(input1) )
val f2 = future( compute(input2) )
val result1 = f1()
val result2 = f2()
merge(result1,result2)
}
}
運(素敵な高速化が、今後の申請を行なう方法がブロックのスレッドのスレッドプールの増加は大いに飛躍しています。時に多くのスレッドが作成されると、計算がstucked.
ある種の 反応 法先物取引プログラム"のひとつとして採択のスレッドかどうかその他の成長はないということだ。ることでしょうか?
編集: を使用していscala2.8.0.最終
解決
な請求の申請) Future
s,この勢いでブロック待ちの回答;てんこれによりデッドロック.代わりに、利用しmonadically伝えしていきます。代わりに:
val result1 = f1()
val result2 = f2()
merge(result1,result2)
してみてください:
for {
result1 <- f1
result2 <- f2
} yield merge(result1, result2)
この結果をま Responder[Result]
は Future[Result]
を含む、統合結果いつもeffectfulこの最終値を用い respond()
または foreach()
, できます map()
または flatMap()
その Responder[T]
.ないブロックが必要だケジューリング計算のために。
編集1:
Okなので、署名の compute
機能は今後変更 Responder[Result]
現在、どのような影響を及ぼすの再帰呼び出し?ましょう:
private def compute( input: Input ):Responder[Result] = {
if( pairs.size < SIZE_LIMIT ) {
future(computeSequential())
} else {
val (input1,input2) = input.split
for {
result1 <- compute(input1)
result2 <- compute(input2)
} yield merge(result1, result2)
}
}
今なwrapを呼 compute
と future(...)
もう既に帰国 Responder
(スーパークラスの Future
).
編集2:
一殺を使用すること継続パスタイルは、あなたのトップレベルのコード--何を話 compute
もともと--なブロックです。だといわれるのか main()
, ことになるすべてのプログラムは、この問題で、今までは産卵のバ先物取引差入証拠金先物取し、その後直ちに停止、終了しました。必要なものは block
これらすべての先物取引が一度だけのトップレベルの結果 すべての の計算ではなくて、中間体となる。
残念ながら、この Responder
これら返される compute()
もうなくなったブロック apply()
方法などに Future
ました。なんなのか、なぜflatMapping Future
s造一般 Responder
の代わりに Future
;このようAPIです。いずれの場合は、対応することができるでしょう自分で作る:
def claim[A](r:Responder[A]):A = {
import java.util.concurrent.ArrayBlockingQueue
import scala.actors.Actor.actor
val q = new ArrayBlockingQueue[A](1)
// uses of 'respond' need to be wrapped in an actor or future block
actor { r.respond(a => q.put(a)) }
return q.take
}
そのために作成するブロックの呼び出計算にお main
方法はこのように:
val finalResult = claim(compute(input))