Mi primera impresión de readFile
fue una compensación entre su comodidad y la posibilidad de que deje los descriptores de archivos abiertos más de lo necesario, sin posibilidad de cerrarlos. Como un experimento que probé el siguiente programa (muy práctico), pensando que podría ahogarse al tratar de mantener un millar de descriptores de archivo abiertos:¿Cuándo es mejor cerrar explícitamente los identificadores de archivo?
main = do
mapM_ (\idx -> readIt) [1..1000]
where readIt = do
contents <- readFile "/etc/passwd"
putChar $ head contents
Pero lo que realmente hace un buen trabajo de recuperación de descriptores de archivos; el recuento nunca supera 70:
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 4
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 5
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 6
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 7
...
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 65
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 66
close(3) = 0
close(4) = 0
close(5) = 0
...
close(54) = 0
close(55) = 0
close(56) = 0
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 3
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 4
¿Cómo va esto? ¿Es solo que los valores de contents
están recibiendo GC'd, y con ellos los descriptores de archivos que ya no se referencian? ¿O hay algún mecanismo separado para administrar los recursos del descriptor de archivos? Cualquiera que sea el mecanismo, parece funcionar bastante bien: ¿cómo puede saber cuándo es mejor usar hClose
explícitamente?
Creo que es solo el GC el que está causando que se cierren los descriptores de archivos. –
En general, es mejor utilizar mecanismos que aseguren el manejo de recursos determinísticos (que no sean la memoria), en Haskell que sería 'bracket '. No confíe en GC con archivos para algo más que un simple caso. El soporte –
solo tendrá sentido con un IO estricto; de lo contrario, el efecto puede filtrarse a través de los datos vagos. –