私は明らかに並列化可能なアルゴリズムを管理するためにscalaとAKKAを調べてきました。私は関数型プログラミングの知識があり、ほとんどがJavaを使用しているので、私のFPはまだ最高ではないかもしれません。
私が使用しているアルゴリズムは非常に単純で、上位の計算があります。
def computeFull(...): FullObject
この計算はサブ計算を呼び出し、それを合計します(単純化するため)。
def computePartial(...): Int
そして、computeFull
このようなことをします(再び単純化します):
val partials = for(x <- 1 to 10
y <- 1 to 10) yield computePartial(x, y)
partials.foldLeft(0)(_ + _)
したがって、これはAKKAの例に非常に近く、PI計算を実行します。呼び出すcomputeFullと、それぞれの中に多くのcomputePartialがあります。したがって、これらすべてをAKKAアクターでラップするか、Futuresで単純化して、各computeFullと各computePartialを別々のスレッドで呼び出すことができます。次に、 http: //doc.akka.io/docs/akka/snapshot/scala/futures.htmlのfold、zip、map関数を使用して、先物を組み合わせることができます。
ただし、これは、computeFullとcomputePartialが実際の結果をラップするFuturesを返す必要があることを意味します。したがって、それらはAKKAに依存するようになり、物事が並行して実行されると想定します。実際、関数内で実行コンテキストを暗黙的に渡す必要もあります。
これは奇妙であり、アルゴリズムはそれがどのように並列化されているか、または並列化されているかどうかの詳細を「知らない」はずだと思います。
(AKKAではなく)scalaのFuturesについて読み、CodeContinuationを調べた後。scala(http://www.scala-lang.org/api/current/scala/Responder.html)によって提供されるResponderモナドは、関数呼び出しの実行方法を抽象化する正しい方法のようです。私は、computeFullとcomputePartialがfuturesではなくRespondersを返す可能性があり、モナドが実行されると、Responder内に埋め込まれたコードがどのように実行されるかを決定するという漠然とした直感を持っています(新しいアクターを生成するか、同じスレッドで実行されるか) )。
しかし、どうやってこの結果を得るのか、私にはよくわかりません。助言がありますか?私は正しい方向に進んでいると思いますか?