假设我有一个使用整数参数的函数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 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