【问题标题】:Haskell async with blocking print [duplicate]Haskell异步与阻塞打印[重复]
【发布时间】:2017-11-04 00:35:07
【问题描述】:

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

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

【问题讨论】:

    标签: haskell concurrency synchronization


    【解决方案1】:

    看起来像 this 问题的欺骗 - 链接代码:

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

    【讨论】:

    • 感谢您找到重复的问题!请不要回答重复的问题,而是flag问题并输入重复的链接。如果其他人同意,该问题将被标记为重复。
    • 啊,好的。我想发表评论但还不能发表评论,我不确定这个标志,因为它似乎没有强调你可以添加额外的信息,只是它调用了一个版主,听起来有点吓人。
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2018-04-06
    • 2016-07-14
    • 2020-10-28
    • 2016-02-15
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多