Wann ist es besser, Dateizugriffsnummern explizit zu schließen?

8

Mein erster Eindruck von readFile war ein Kompromiss zwischen seiner Bequemlichkeit und der Möglichkeit, die Dateideskriptoren länger als nötig geöffnet zu lassen, ohne sie zu schließen. Als ein Experiment habe ich das folgende (sehr praktische) Programm ausprobiert und dachte, es könnte sich ersticken, wenn ich versuche, tausend offene Dateideskriptoren zu verwalten:

%Vor%

Aber es macht wirklich einen ziemlich guten Job, Dateideskriptoren zurückzufordern; die Zählung wird nie über 70 hinausgehen:

%Vor%

Wie ist das passiert? Ist es nur, dass die Werte von contents GC'd werden, und mit ihnen die nicht mehr referenzierten Dateideskriptoren? Oder gibt es einen separaten Mechanismus zum Verwalten von Datei-Deskriptor-Ressourcen? Was auch immer der Mechanismus ist, es scheint ziemlich gut zu funktionieren - wie kannst du wissen, wann es am besten ist, hClose explizit zu verwenden?

    
gcbenison 29.05.2012, 21:08
quelle

2 Antworten

8

Es ist besser, Ressourcen nur dann explizit zu schließen, wenn Sie eine Ressourcenbeschränkung auf niedriger Ebene haben, die Sie manuell erzwingen können.

Die zu berücksichtigenden Fälle:

  • Ressourcen, die über Lazy IO erworben wurden, müssen den GC verwenden, um die Ressource
  • freizugeben
  • strict IO: kann manuell schließen, sobald die Eingabe gelesen wurde; oder verwenden Sie einen Bracketing-Kombinator (z. B. finally oder bracket )
  • Inkrementelles IO (Conduits, Iteratees): Lassen Sie das Framework es für Sie schließen.
Don Stewart 29.05.2012, 21:58
quelle
7

Die Haddock-Dokumentation für System.IO hat dies zu sagen:

  

GHC-Hinweis: Ein Handle wird automatisch geschlossen, wenn der Garbage Collector erkennt, dass das Programm keine Referenz mehr enthält. Es wird jedoch im Allgemeinen nicht empfohlen, sich auf dieses Verhalten zu verlassen: Der Garbage Collector ist unvorhersehbar. Verwenden Sie nach Möglichkeit eine explizite hClose, um Handles zu schließen, wenn sie nicht mehr benötigt werden. GHC versucht derzeit nicht, Dateideskriptoren freizugeben, wenn sie abgelaufen sind. Es liegt in Ihrer Verantwortung sicherzustellen, dass dies nicht geschieht.

    
Nathan Kleyn 29.05.2012 21:58
quelle

Tags und Links