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