假设我想在Haskell中的两个独立线程中计算两个长时间运行的进程。但是,我只关心第一个完成的结果。我该怎么做?
示例(伪代码):
thread1 = spark $ long_running some_arg1
thread2 = spark $ long_running some_arg2
result = first_done thread1 thread2 -- Maybe even first_done [thread1, thread2]?
答案 0 :(得分:17)
async包执行此操作,现在是Haskell Platform的一部分。
import Control.Concurrent.Async
import Control.Concurrent (threadDelay)
main :: IO ()
main = do
x <- async (threadDelay 2000000 >> return 1)
y <- async (threadDelay 1000000 >> return 2)
(_, res) <- waitAnyCancel [x, y]
print (res :: Int)
答案 1 :(得分:3)
如果您希望长时间运行的线程被杀死,可以使用:http://hackage.haskell.org/package/unamb
否则你可以做与unamb相同的事情,但不要使用killThread。
答案 2 :(得分:2)
如果您使用IO
个帖子,您还可以使用最新的parallel-io个包,特别是parallelFirst。