我正在使用
import Control.Concurrent.ParallelIO.Global
main = parallel_ (map processI [1..(sdNumber runParameters)]) >> stopGlobalPool
,其中
processI :: Int -> IO ()
是一些函数,它从文件中读取数据,处理它并将其写入另一个文件。 没有输出到终端。问题是当我使用+RTS -N8
运行程序时终端充满了随机文本,如
piptufuht teata thtsieieo ocnsno e nscsdeoe qnqvuduee ernvnstetiirioasanlil lolwynya. .s
w
a s s uY Ysosopuuue's'nvpvdeeee n dpdp rerdodoub beada
bub lel y
发生了什么事?没有+ RTS就没有混乱。我无法使用更简单(适合在此处发布)的程序重现行为。
GHC 7.0.3如果重要
答案 0 :(得分:6)
缓冲可能会阻止您构建一个简单的测试用例。我能够用它重现它(仅当使用+ RTS -Nsomething运行时):
import Control.Concurrent
import System.IO
main :: IO ()
main = do
hSetBuffering stdout NoBuffering
forkIO $ putStrLn "foo"
forkIO $ putStrLn "bar"
forkIO $ putStrLn "baz"
threadDelay 1000 -- Allow things to print
正如托马斯所提到的,你可能需要以某种方式对此进行排序,尽管我不确定如何直接写入文件会改变这一点。这是一个简单的示例,您可以使用Chan
对此进行排序。我确信有更好的方法可以做到这一点,这只是我如何解决这个问题的一个例子。
import Control.Concurrent
import Control.Concurrent.Chan
import System.IO
main :: IO ()
main = do
hSetBuffering stdout NoBuffering
ch <- newChan -- Things written here are picked up by stuffWriter
forkIO $ stuffWriter ch -- Fire up concurrent stuffWriter
forkIO $ writeChan ch "foo"
forkIO $ writeChan ch "bar"
forkIO $ writeChan ch "baz"
threadDelay 1000 -- Allow things to print
-- | Write all the things!
stuffWriter :: Chan String -> IO ()
stuffWriter ch = do
readChan ch >>= putStrLn -- Block, then write once I've got something
stuffWriter ch -- loop... looking for more things to write
现在你对某个地方的写入现在是同步的(stuffWriter
一次一个地写东西),你应该没有更多的垃圾。