2017-11-04 125 views
1

我有一个IO操作列表,我想同时执行,所以我使用的是async包中的mapConcurrently
我的IO操作包括print表达式,例如:Haskell async with blocking 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

貌似的this问题进行重复数据删除 - 链接代码:

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

感谢找到重复的问题!请不要回答重复的问题,而是[flag](https://stackoverflow.com/help/privileges/flag-posts)问题并输入重复的链接。如果其他人同意,该问题将被标记为重复。 – Gilles

+0

啊,好的。我想发表评论,但还不能确定,因为它似乎并不强调你可以添加额外的信息,只是它称为主持人,听起来有点可怕。 – Zpalmtree