1

我的程序从网络套接字读取一行并将其写入磁盘。由于行可能真的很长而且字符串的性能很差,我开始使用惰性字节字符串。现在看来,Haskell 将通过hClose磁盘文件句柄而不将整个字节字符串实际刷新到磁盘,这样做:

  • 打开文件进行写入
  • 将字节字符串写入文件hPut
  • 关闭文件
  • 打开文件进行阅读

通常会导致openFile: resource busy (file is locked).

是否可以在关闭文件之前强制执行评估并等待写入整个字节字符串,所以我可以确定在该操作之后文件实际上是关闭的?

4

2 回答 2

0

尝试将严格 i/o 与严格字节字符串一起使用,而不是使用惰性 i/o 和惰性字节字符串。

如果结果证明效率太低,请尝试使用导管或类似的包。

于 2012-04-01T08:21:35.660 回答
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
于 2012-04-13T09:48:06.843 回答