Un modèle que j'ai rencontré un certain nombre de fois maintenant est celui où une liste de valeurs doit être vérifiée en mappant un test dessus et en voyant si certains ou tous les éléments ont réussi. La solution typique consiste simplement à utiliser les fonctions intégrées all
et any
.
Le problème est que ceux-ci sont évalués en série. Dans de nombreux cas, il serait beaucoup plus rapide d'évaluer en parallèle avec le processus étant terminé une fois qu'un thread trouve un "False" pour all
ou un "True" pour any
. Je suis à peu près sûr que le comportement de court-circuit ne peut pas être implémenté à l'aide de Control.Parallel car il nécessite une communication inter-processus et je ne comprends pas assez près de Control.Concurrent pour l'implémenter.
C'est un modèle assez courant en mathématiques (par exemple Miller-Rabin Primality), donc j'ai l'impression que quelqu'un a probablement déjà trouvé une solution pour cela, mais pour des raisons évidentes, faire une recherche Google pour "parallèle ou / et / tout / tout sur la liste" haskell "ne renvoie pas beaucoup de résultats pertinents.
unamb
bibliothèque
pthreads
en C ou les threads verts dans Haskell) Vous ne démarrez pas plusieurs serveurs Web afin de gérer les requêtes Web simultanées, au lieu de cela, vous exécutez plusieurs threads en un seul processus! Il en va de même pour le parallélisme. Vous faites tourner autant de threads que vous avez de CPU et répartissez votre travail de manière égale, prenant ainsi en charge les tâches liées au CPU. Essayez cette bibliothèque pour vous convaincre github.com/lehins/haskell-scheduler