簡體   English   中英

強制評估惰性IO

[英]Forcing evaluation on lazy IO

我的程序從網絡套接字讀取一行並將其寫入光盤。 由於行可能真的很長並且字符串的性能很差,所以我開始使用惰性字節字符串。 現在看來,Haskell會在光盤文件句柄上超過hClose ,而實際上沒有將整個字節串刷新到光盤上,因此請執行以下操作:

  • 打開文件進行寫入
  • hPut將字節字符串寫入文件
  • 關閉檔案
  • 打開文件以供閱讀

通常會導致openFile: resource busy (file is locked)

是否可以強制執行評估並等待整個字節字符串寫入后再關閉文件,所以我可以確定在該操作之后文件實際上已關閉了嗎?

由於唯一的其他答案是“使用其他東西”,因此我發布了自己的解決方案。 hClose之后使用此功能將掛起線程,直到完成延遲寫入為止。

waitForLazyIO location = do
    t <- liftIO $ try $ openFile location AppendMode
    handle t
    where
        handle (Right v) = hClose v
        handle (Left e)
            -- Add some sleep if you expect the write operation to be slow.
            | isAlreadyInUseError e = waitForLazyIO location
            | otherwise = throwError $ show e

嘗試對嚴格字節字符串使用嚴格I / O,而不是惰性I / O和惰性字節字符串。

如果發現效率太低,請嘗試使用導管或類似的包裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM