Haskell异步与阻止打印

时间:2017-11-04 00:35:08

标签: haskell concurrency synchronization

我有一个我希望同时执行的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一次输出一个字符,所以当它从多个线程执行时,所有输出都是交错的。

解决这个问题的典型方法是什么?

1 个答案:

答案 0 :(得分:0)

看起来像this问题的愚蠢 - 链接代码:

do mutex <- newMVar ()
   let putStrLn' = withMVar mutex . const . putStrLn 
   mapConcurrently_ (iofunPrintingWith putStrLn') folderList