我正在寻找Haskell中ExecutorService.invokeAll的等效功能。我需要实现它吗?来自文档:
执行给定的任务,在完成所有任务后返回持有其状态和结果的Futures列表。
在我的用例中,任务花费大部分时间等待IO,所以我只需要避免不断阻塞主线程,这会产生Either
结果或错误的集合。
答案 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
的列表,您可以wait
,poll
以及许多其他操作。