評価される式がどれだけコストがかかるかによって異なります。現在のアーキテクチャでは、数個から数十個、さらには数百個の命令を含む 2 つの式を並列で効率的に評価することはできません。したがって、実行している作業の量が並列化自体のコストに影を落としていないことを常に確認する必要があります。
この免責事項を念頭に置いて、Scala 2.10 ではFuture
s を使用してこれを実現できます。
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))
タプルが将来利用可能になるまでブロックします。
フューチャー、コールバック、ブロッキングの詳細については、こちらをご覧ください。