如何展开“Running processes concurrently”以包含stdin和stdout?
例如,假设我的(Windows)命令在stdout上输出10,我想检查所有进程的输出是否正确:
let cmds = replicate 100 "echo 10"
我应该如何编写Haskell程序?
答案 0 :(得分:1)
import Control.Concurrent.Async
import System.IO
import System.Process
您关联的网站上的代码使用runCommand
;允许您访问流的等效项是runInteractiveCommand
。然后,您可以使用hGetContents
从流中读取。
-- | Run @echo 10@ and tests whether the output is what we expect.
testOne :: IO Bool
testOne =
runInteractiveCommand "echo 10" >>= \(_stdin, stdout, _stderr, _proc) ->
hGetContents stdout >>= \out ->
return (out == "10\n")
然后我们可以使用async
包中的replicateConcurrently
同时运行100次,并在结果上fmap (all id)
获取所有的布尔和结果。
-- | Run 'testOne' 100 times concurrently, return whether all tests succeeded.
testMany :: IO Bool
testMany =
all id <$> replicateConcurrently 100 testOne