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