异步映射中的同步部分

时间:2017-07-05 02:11:30

标签: haskell asynchronous synchronized

我有一个很大的IO功能,它将继续从文件夹加载数据,对数据执行纯计算,然后将其写回。

我使用

在多个文件夹上并行运行此功能
mapConcurrently_ iofun folderList

来自http://hackage.haskell.org/package/async-2.1.1.1/docs/Control-Concurrent-Async.html#v%3amapConcurrently

这很有效......但有点太好了。现在,即使putStrLn调用的字符输出也是异步的,这会导致无法读取控制台日志。

有没有办法让IO动作同步,甚至更好的同步版本的putStrLn?

1 个答案:

答案 0 :(得分:2)

如果要使用STM,则协调线程的方式是MVar s或TVar s。您可以在"并行和并发Haskell"中阅读所有相关内容。你可以这样做:

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