5

2 つの式 e1 と e2 が不変のデータ構造のみを扱う場合、タプル (e1、e2) を並列に評価するのは非常に簡単です。異なるプロセッサで 2 つの式を評価するだけで、相互作用について心配する必要はありません。何でもありません。

Scala には不変のデータ構造がたくさんあるので、そのタプルを並行して評価するための非常に単純な (書くための) 方法があると期待しています。何かのようなもの

par_tuple : ( Unit -> T1) -> (Unit -> T2) -> (T1, t2)

これは、2 つの関数を並行して評価し、両方が終了すると戻ります。

まだ見てないけど。それは存在しますか?そうでない場合、どのように書きますか?

4

1 に答える 1

6

評価される式がどれだけコストがかかるかによって異なります。現在のアーキテクチャでは、数個から数十個、さらには数百個の命令を含む 2 つの式を並列で効率的に評価することはできません。したがって、実行している作業の量が並列化自体のコストに影を落としていないことを常に確認する必要があります。

この免責事項を念頭に置いて、Scala 2.10 ではFutures を使用してこれを実現できます。

val f = future { e1 }
val g = future { e2 }
(Await.result(f), Await.result(g))

このスタイルの計算は推奨されないことに注意してください (上記は意図的に過度に冗長です!)。これにはブロッキングが含まれ、効率的な継続の概念がない JVM などのプラットフォームでのブロッキングはしばしばコストがかかります (ただし、適用可能であり、この回答の範囲を超えており、おそらくこの回答者の範囲を超えています)。ほとんどの場合、値が使用可能になったときに呼び出されるコールバックをフューチャにインストールする必要があります。代わりにこれを行うことができます:

val h = for {
  x <- f
  y <- g
} yield (x, y)

上記は、両方がh利用可能になると、値のタプルを含む新しい未来です。

par_tuple関数を次のいずれかに書き換えることができます。

def par_tuple[E1, E2](e1: =>E1, e2: =>E2): Future[(E1, E2)] = {
  val f = future { e1 }
  val g = future { e2 }
  val h: Future[(E1, E2)] = for {
    x <- f
    y <- g
  } yield (x, y)
  h
}

このメソッドは、Future必要なタプルの を返します。これは、最終的に式でタプルを保持するオブジェクトです。この未来を他の計算でさらに構成することも、ブロックしたいことが確実な場合は、別のバリアントを作成することもできます。

def par_tuple_blocking[E1, E2](e1: =>E1, e2: =>E2): (E1, E2) = Await.result(par_tuple(e1, e2))

タプルが将来利用可能になるまでブロックします。

フューチャー、コールバック、ブロッキングの詳細については、こちらをご覧ください。

于 2012-10-16T21:23:21.567 に答える