假设我有一个使用整数参数的函数ff可能不会因某些参数而终止,但是其结果同样有价值。 (具体而言,参数可以是随机数生成器的种子,该生成器将传递给SAT解算器。)

我想使用并发并调用f 1f 2f 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 wiki page的表面观察表明它可能不支持非终止过程?

测试

目前,我无法获得所需的答案。我认为这可能与我如何创建流程有关,而不是其他任何问题。

定义

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(我有一台四核计算机)运行似乎没有帮助。

最佳答案

代替amb,考虑unamb!它为纯正和不纯的赛车计算提供了一些不错的原语。例如:

Prelude Data.Unamb> unamb (last [1..]) 32
32
Prelude Data.Unamb> race (threadDelay 5000000 >> return 3) readLn
Prelude Data.Unamb Control.Concurrent> race (threadDelay 5000000 >> return 3) readLn
56
56
Prelude Data.Unamb Control.Concurrent> race (threadDelay 5000000 >> return 3) readLn
3

10-04 10:03