プロセスを作成し、自分のhaskellプログラムのテキストを(IOアクションの)プロセスのstdinに定期的に書きたいとします。IOアクションの出力をhaskellのプロセスにパイプする方法
以下はGHCiでは正しく動作しますが、ビルドして実行すると正しく動作しません。 GHCiではすべてが完全に機能し、IOアクションの値は定期的に入力されます。しかし、ビルドして実行すると、プロセスの標準入力に書き込むときには、長時間のうちに一時停止するように見えます。
私がハンドルを作成する(System.Process
から)CreateProcess
を使用し、(bufferentがNoBuffering
に設定する - のいずれかLineBuffering
didntの仕事)hPutStrLn
を試みました。
私はprocess-streaming
パッケージとpipes
パッケージを試していますが、何もできないようです。
本当の質問はこれです。私はどのようにしてhaskellからプロセスを作成し、それを定期的に書きますか?
この挙動を示す最小例:
import System.Process
import Data.IORef
import qualified Data.Text as T -- from the text package
import qualified Data.Text.IO as TIO
import Control.Concurrent.Timer -- from the timers package
import Control.Concurrent.Suspend -- from the suspend package
main = do
(Just hin, _,_,_) <- createProcess_ "bgProcess" $
(System.Process.proc "grep" ["10"]) { std_in = CreatePipe }
ref <- newIORef 0 :: IO (IORef Int)
flip repeatedTimer (msDelay 1000) $ do
x <- atomicModifyIORef' ref $ \x -> (x + 1, x)
hSetBuffering hin NoBuffering
TIO.hPutStrLn hin $ T.pack $ show x
任意の助けを大幅に理解されるであろう。
threadDelayは、サスペンド(最小待機を指定する)を使用している理由のタイミングメカニズムとして非常に不正確です。私はhSetBufferingソリューションを試しましたが、違いはありませんでした。 –
well - 'suspend'は' threadDelay'の観点から実装されています。... Haskellのすべてのタイミング遅延はほとんどあります。 – ErikR
これは実際の質問に対処していますか(コンパイル時に任意の長い遅延があることを見つけることについて)まったくですか?それは唯一の文章の提案が含まれて表示されます。 –