質問

私は利用しようと、世界からはみ出(通称フォーク/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.最終

役に立ちましたか?

解決

な請求の申請) Futures,この勢いでブロック待ちの回答;てんこれによりデッドロック.代わりに、利用し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を呼 computefuture(...) もう既に帰国 Responder (スーパークラスの Future).

編集2:

一殺を使用すること継続パスタイルは、あなたのトップレベルのコード--何を話 compute もともと--なブロックです。だといわれるのか main(), ことになるすべてのプログラムは、この問題で、今までは産卵のバ先物取引差入証拠金先物取し、その後直ちに停止、終了しました。必要なものは block これらすべての先物取引が一度だけのトップレベルの結果 すべての の計算ではなくて、中間体となる。

残念ながら、この Responder これら返される compute() もうなくなったブロック apply() 方法などに Future ました。なんなのか、なぜflatMapping Futures造一般 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))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top