Wzorzec, z którym się zetknąłem już wiele razy, jest taki, w którym należy sprawdzić listę wartości, mapując na niej jakiś test i sprawdzając, czy którykolwiek lub wszystkie elementy przeszły. Typowym rozwiązaniem jest po prostu użycie wygodnych wbudowanych all
i any
.
Problem polega na tym, że oceniają one szeregowo. W wielu przypadkach ocena byłaby znacznie szybsza równolegle z zakończeniem procesu, gdy jakikolwiek wątek znajdzie „Fałsz” all
lub „Prawda” dla any
. Jestem całkiem pewien, że zachowanie zwarciowe nie może być zaimplementowane przy użyciu Control.Parallel, ponieważ wymaga komunikacji między procesami i nie rozumiem nigdzie wystarczająco blisko Control.Concurrent, aby to zaimplementować.
Jest to dość powszechny wzorzec w matematyce (np. Miller-Rabin Primality), więc wydaje mi się, że ktoś prawdopodobnie już wymyślił rozwiązanie tego problemu, ale z oczywistych powodów szuka w Google hasła „równoległe lub / i / dowolne / wszystkie na liście” haskell ”nie zwraca wielu trafnych wyników.
unamb
bibliotece
pthreads
w C, czy zielonymi w Haskell). Nie uruchamiasz wielu serwerów w celu obsługi współbieżnych żądań sieciowych, zamiast tego uruchamiasz wiele wątków w jednym procesie! To samo dotyczy równoległości. Rozwijasz tyle wątków, ile posiadasz procesorów i dzielisz pracę równo, dbając w ten sposób o zadania związane z procesorem. Wypróbuj tę bibliotekę, aby się przekonać github.com/lehins/haskell-scheduler