我有一个我希望同时执行的IO操作列表,因此我使用async
包中的mapConcurrently
。
我的IO操作包括print
个表达式,例如:
processLink :: String -> IO ()
processLink link = do
result <- fetchLink
print $ "Link " ++ link ++ "has been processed"
在我的main
我有类似的内容:
main :: IO ()
main = do
_ <- mapConcurrently (processLink) links
print "Done!"
所有内容都是并行执行的,但似乎print
也是逐字符并行执行的,所以我在输出中得到了垃圾。
我想我理解它为什么会发生 - print
一次输出一个字符,所以当它从多个线程执行时,所有输出都是交错的。
解决这个问题的典型方法是什么?
答案 0 :(得分:0)
看起来像this问题的愚蠢 - 链接代码:
do mutex <- newMVar ()
let putStrLn' = withMVar mutex . const . putStrLn
mapConcurrently_ (iofunPrintingWith putStrLn') folderList