如何实现相当于invokeAll的Haskell

时间:2014-04-10 16:37:36

标签: haskell concurrency

我正在寻找Haskell中ExecutorService.invokeAll的等效功能。我需要实现它吗?来自文档:

  

执行给定的任务,在完成所有任务后返回持有其状态和结果的Futures列表。

在我的用例中,任务花费大部分时间等待IO,所以我只需要避免不断阻塞主线程,这会产生Either结果或错误的集合。

2 个答案:

答案 0 :(得分:6)

该类问题的标准解决方案是"async"库。尽管我理解你的问题,但你需要这样的东西:

import Control.Concurrent.Async

processActions :: [IO a] -> IO ()
processActions actions = do
  -- Execute all the actions concurrently and
  -- get a list of asyncs (an equivalent to futures):
  asyncs <- mapM async actions
  -- Do whatever you want...
  -- ...
  -- Block until all the asyncs complete:
  mapM_ wait asyncs

但是库提供了很多其他模式,所以你应该检查一下。您需要的是mapConcurrently函数。

答案 1 :(得分:2)

没问题。只需使用async库并运行mapM async someListOfJobs即可获得Async的列表,您可以waitpoll以及许多其他操作。