Предположим, у меня есть функция f
, которая принимает целочисленный аргумент. f
может не заканчиваться на некоторых аргументах, но его результат одинаково ценен. (Для конкретности аргумент может быть начальным числом для генератора случайных чисел, который передается в решатель SAT.)
Я хочу использовать параллелизм, вызывать f 1
, f 2
, f 3
и т. Д. И возвращаться после завершения первого. Итак, в каждом потоке должен быть запущен код, который выглядит как
comp <- start_proc (f 1)
wait(comp || anyDone) -- wait for _either_ of these signals to be true
if comp then
set anyDone = True
Какой самый простой способ сделать это? Оператор AMB приходит на ум, но мне нужно запускать все процессы одновременно (например, на 24- или 80-ядерном компьютере). (Решения для распределенных вычислений были бы еще лучше.) Поверхностный взгляд на вики-страницу AMB предполагает, что она может не поддерживать непрерывные процессы?
тест
В настоящее время я не получаю ответы для работы с тем, что я хочу. Я думаю, что это, вероятно, больше связано с тем, как я создаю процессы, чем с чем-либо еще.
Определение
runProc (x:xs) =
createProcess (proc x xs) >>= \(_, _, _, h) -> waitForProcess h
Тогда я хочу участвовать в гонках runProc ["zsh", "-c", "sleep 3"]
и runProc ["ls"]
. Я немного изменил ответ Томаса, но он не сработал.
raceL :: [IO α] -> IO α
raceL ops = do
mv <- newEmptyMVar
tids <- forM ops (\op -> forkIO (op >>= putMVar mv))
answer <- takeMVar mv
mapM_ killThread tids
return answer
Компиляция с -threaded
и работа с +RTS -N
(у меня 4-ядерный компьютер), похоже, не помогает.