我的程序从网络套接字读取一行并将其写入光盘。由于行可能非常长并且字符串性能很差,所以我开始使用惰性字节字符串。现在看来Haskell将在光盘文件句柄上超过hClose
,而不会将整个字节字符串刷新到光盘,所以这样做:
hPut
通常会产生openFile: resource busy (file is locked)
。
是否可以强制执行评估并等待在关闭文件之前写入整个字节字符串,因此我可以确定该文件在该操作之后实际上已关闭?
答案 0 :(得分:0)
尝试使用严格的i / o和严格的字节字符串,而不是lazy i / o和lazy byte strings。
如果结果效率太低,请尝试使用conduit或类似的包。
答案 1 :(得分:0)
由于唯一的另一个答案是“使用别的东西”,我发布了自己的解决方案。在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