Буферирование, вероятно, мешает вам создать простой контрольный пример. Я смог воспроизвести его с этим (только при запуске с + 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
пишет вещи по одному), и вы не должны больше ничего говорить.