并行IO导致终端中的随机文本输出



我用

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

缓冲可能会阻止您构建一个简单的测试用例。我可以这样重现它(只有在使用+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

正如Thomas所提到的,您可能需要以某种方式对其进行排序,尽管我不确定直接写入文件会如何改变这一点。这里有一个简单的例子,如何用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写东西,一次一个),你应该没有更多的乱码

最新更新