gpt4 book ai didi

haskell - 并行 IO 导致终端出现随机文本输出

转载 作者:行者123 更新时间:2023-12-05 00:36:03 28 4
gpt4 key购买 nike

我正在使用

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

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

关于haskell - 并行 IO 导致终端出现随机文本输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647692/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com