Real World Haskellの第28章、ソフトウェアトランザクショナルメモリでは、同時Webリンクチェッカーが開発されています。Webページ内のすべてのリンクをフェッチし、それらのすべてをHEADリクエストでヒットして、リンクがアクティブかどうかを判断します。このプログラムを構築するために並行アプローチが採用され、次のステートメントが作成されます。
URLごとに1つのスレッドを作成することはできません。これは、(予想どおり)ほとんどのリンクがライブで応答性が高い場合、CPUまたはネットワーク接続に負担がかかる可能性があるためです。代わりに、キューからダウンロードするURLをフェッチする固定数のワーカースレッドを使用します。
forkIO
リンクごとに使用する代わりに、このスレッドプールが必要な理由を完全には理解していません。AFAIK、Haskellランタイムはスレッドのプールを維持し、それらを適切にスケジュールするので、CPUが過負荷になっているのはわかりません。さらに、Haskellメーリングリストでの並行性についての議論で、私は次のステートメントが同じ方向に進んでいることを発見しました。
Haskellで意味をなさない1つのパラダイムは、ワーカースレッドです(RTSが私たちのためにそれを行うため)。ワーカーをフェッチする代わりに、代わりにforkIOを取得します。
スレッドのプールはネットワーク部分にのみ必要ですか、それともCPUの理由がありますか?