[英]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.