Принудительная оценка на ленивом IO

Моя программа читает строку из сетевого сокета и записывает ее на диск. Поскольку строки могут быть очень длинными, а строки имели ужасную производительность, я начал использовать ленивые байтовые строки. Теперь кажется, что Haskell пройдет мимо hClose на дескрипторе файла диска, фактически не сбрасывая всю байтовую строку на диск, делая так:

  • открыть файл для записи
  • записать байтовую строку в файл с hPut
  • закрыть файл
  • открыть файл для чтения

обычно приводит к openFile: resource busy (file is locked),

Можно ли принудительно выполнить оценку и дождаться записи всей байтовой строки перед закрытием файла, чтобы я мог быть уверен, что файл действительно закрыт после этой операции?

2 ответа

Решение

Поскольку единственный другой ответ - это "использовать что-то другое", я публикую свое собственное решение. Используя эту функцию после 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

Попробуйте использовать строгий ввод-вывод со строгими байтовыми строками вместо ленивых операций ввода-вывода и ленивых байтовых строк.

Если это окажется слишком неэффективным, попробуйте использовать кабелепровод или подобный пакет.

Другие вопросы по тегам