En Real World Haskell, chapitre 28, mémoire transactionnelle logicielle un vérificateur de liens web simultané est développé. Il récupère tous les liens d'une page Web et envoie une requête HEAD à chacun d'entre eux pour savoir si le lien est actif. Une approche concurrente est adoptée pour construire ce programme et la déclaration suivante est faite :
Nous ne pouvons pas simplement créer un thread par URL, car cela pourrait surcharger notre CPU ou notre connexion réseau si (comme nous le pensons) la plupart des liens sont actifs et réactifs. Au lieu de cela, nous utilisons un nombre fixe de fils de travail, qui récupèrent les URL à télécharger à partir d'une file d'attente.
Je ne comprends pas bien pourquoi ce pool de threads est nécessaire au lieu d'utiliser forkIO
pour chaque lien. À ma connaissance, le moteur d'exécution Haskell maintient un pool de threads et les planifie de manière appropriée, de sorte que je ne vois pas de surcharge pour le CPU. En outre, dans une discussion sur la concurrence sur la liste de diffusion Haskell J'ai trouvé la déclaration suivante qui va dans le même sens :
Le seul paradigme qui n'a pas de sens en Haskell est celui des threads de travail (puisque le RTS le fait). pour nous) ; au lieu d'aller chercher un worker, il suffit de forkIO à la place.
Le pool de threads est-il seulement nécessaire pour la partie réseau ou y a-t-il une raison CPU pour cela aussi ?