2017-11-04 155 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