Real World Haskell, Chapter 28, Software transactional memoryには、同時ウェブリンクチェッカーが開発されています。それはウェブページ内のすべてのリンクを取得し、HEADリクエストで1回ずつヒットし、リンクがアクティブかどうかを判断します。純粋なHaskellコードにはスレッドプールが必要ですか?
URLごとに1つのスレッドを作成するだけでは、CPUやネットワーク接続に負荷がかかる可能性があるため、リンクのほとんどは生き生きと応答しています。代わりに、キューからダウンロードするためにURLをフェッチする固定数のワーカースレッドを使用します。
各リンクにforkIO
を使用する代わりに、このスレッドプールが必要な理由を完全に理解できません。 AFAIK、Haskellランタイムはスレッドのプールを維持し、適切にスケジューリングするので、CPUが過負荷になることはありません。さらに、a discussion about concurrency on the Haskell mailing listに、私は同じ方向に行く次の文を見つけました:(RTSは、私たちのためにその をしているので)Haskellでは意味がありません
1つのパラダイムは、ワーカースレッドです。ワーカーをフェッチするのではなく、代わりにforkIOを使用します。
スレッドのプールはネットワーク部分にのみ必要ですか、それともCPUの理由もありますか?
プールは、並行性のレベルを制御し、管理するために必要です。実用的な考慮事項はおそらく忘れているでしょう。ハスケルランタイムは、実際にはハスケルスペーススレッドを維持するのには非常に優れています。それらはかなり軽量であり、何千もの問題は発生しません。しかし、100KのURLのリストを取得し、「プールする」ことなく1つずつforkIOするとどうなりますか?あなたは何千もの接続を何千も作るでしょう。多くの場合、タイムアウトになります。システムはファイル記述子を使い果たし、結果を処理しようとするとRAMが不足する可能性があります。 – ozataman