强制评估惰性IO

时间:2012-03-31 22:16:37

标签: haskell lazy-evaluation lazy-io

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

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

通常会产生openFile: resource busy (file is locked)

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

2 个答案:

答案 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
相关问题