並列性
💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。
これまでに、spawn 式を使うことで式を新しいスレッドで評価できることを見てきました:
region rc {
spawn (1 + 2) @ rc
}
これにより、構造化並行性を用いて並行・並列プログラムを書くことができます。ただし欠点として、スレッド間の通信をチャネルを使って手動で調整しなければなりません。
並行性は不要で並列性だけが欲しい場合には、より軽量な方法として par-yield 式を使うことができます:
par (x <- e1; y <- e2; z <- e3)
yield x + y + z
この式は e1、e2、e3 を並列に評価し、それらの結果を x、y、z に束縛します。
par-yield を使うと、並列版の List.map 関数を書くことができます:
def parMap(f: a -> b, l: List[a]): List[b] = match l {
case Nil => Nil
case x :: xs =>
par (r <- f(x); rs <- parMap(f, xs))
yield r :: rs
}
この関数は f(x) と parMap(f, xs) を並列に評価します。
注意:
par-yield構文は純粋な式に対してのみ機能します。
エフェクトを伴う操作を並列に実行したい場合は、明示的なリージョンとスレッドを使う必要があります。