13章スレッドを用いた並列プログラミング

複数の対話があるプログラムをモジュール化する方法として並行性を議論してきました。例えば、並行性のおかげで、一度に1つのクライアントしか扱わないコードを別々に書くだけで、多数のクライアントと同時に対話するネットワークサーバを作れます。これらの対話は、重ね合わせたい操作のバッチ処理であることもあります。例えば、複数のURLを同時にダウンロードする場合などです。目標はI/Oを重ね合わせてプログラムの高速化を図ることでした。しかし、これは並列性とは言えません。高速化を達成するのに複数のプロセッサを必要としないからです。このような高速化は、複数のウェブサーバが応答するのを待つ時間を重ね合わせることで得られます。

しかし、並行性は並列性を実現するためにも使われます。本書では、並列性が使えるところでは、並列プログラミングのモデル(Eval戦略、Parモナドなど)を利用することを勧めてきました。しかし、これらの純粋な並列プログラミングモデルが使えないような問題もあります。その問題は、以下の2つに分類されます。

  • I/Oをしなければならない問題
  • 内部的な非決定性に依存するアルゴリズム

副作用があるということが必然的に並列プログラミングモデルを排除するというわけではありません。Haskellには副作用のある計算を隠蔽するためのSTモナドがあるからです。しかし、典型的にはSTモナドの中で並列性を用いることは困難です。問題がRepaモデル(第5章「Repaを用いたデータ並列プログラミング」)に適合しないなら、そのような場合の唯一の解決策は、並行性の問題に落とし込むことです。

13.1 並行性を用いて並列性を達成する方法

多くの場合、作業するスレッドをいくつか生成することで並列性が得られます。エラーを適切に伝播し、スレッドを一掃するには ...

Get Haskellによる並列・並行プログラミング now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.