Шаблон, с которым я сталкивался несколько раз, - это тот, в котором список значений должен быть проверен путем сопоставления некоторого теста и проверки, прошел ли какой-либо или все элементы. Типичное решение - просто использовать удобные встроенные функции all
и any
.
Проблема в том, что они оцениваются в сериале. Во многих случаях было бы намного быстрее выполнять оценку параллельно с завершением процесса, если какой-либо поток найдет «False» для all
или «True» для any
. Я почти уверен, что поведение короткого замыкания не может быть реализовано с помощью Control.Parallel, поскольку оно требует межпроцессного взаимодействия, и я пока не понимаю достаточно близко к Control.Concurrent, чтобы реализовать это.
Это довольно распространенный паттерн в математике (например, Миллер-Рабин Прималити), поэтому я чувствую, что кто-то, возможно, уже нашел решение для этого, но по понятным причинам делает поиск в Google "параллельно или / и / любой / все в списке". haskell "не возвращает много релевантных результатов.
unamb
библиотекой
pthreads
в C или зелеными потоками в Haskell). Вы не запускаете несколько веб-серверов для обработки одновременных веб-запросов, вместо этого вы запускаете несколько потоков в одном процессе! То же относится и к параллелизму. Вы раскручиваете столько потоков, сколько имеете процессоров, и равномерно распределяете свою работу, таким образом заботясь о задачах, связанных с процессором. Попробуйте эту библиотеку, чтобы убедить себя github.com/lehins/haskell-scheduler