Hoe voorkom je dat het limiet van open bestandsbeschrijvingen in het systeem wordt overschreden?
sobes.tech AI
Antwoord van AI
Om het overschrijden van de limiet van open bestand descriptors in het systeem in Go te voorkomen, kunnen verschillende benaderingen worden gebruikt:
-
Beperk het aantal gelijktijdig geopende bestanden — implementeer een descriptor pool of een semaphore die het aantal geopende bestanden controleert.
-
Sluit bestanden onmiddellijk na gebruik — roep altijd
file.Close()aan indeferdirect na het openen van het bestand, om resources vrij te maken. -
Controleer en verhoog de systeemlimieten — met systeemoproepen (bijvoorbeeld
ulimitin Unix) kan het maximale aantal open bestanden worden verhoogd.
Voorbeeld van het gebruik van een semaphore om het aantal geopende bestanden te beperken:
package main
import (
"fmt"
"os"
"sync"
)
var maxOpenFiles = 100
var sem = make(chan struct{}, maxOpenFiles)
func openFile(path string) (*os.File, error) {
sem <- struct{}{} // neem een slot
f, err := os.Open(path)
if err != nil {
<-sem // vrijgeven van slot bij fout
return nil, err
}
return f, nil
}
func closeFile(f *os.File) {
f.Close()
<-sem // vrijgeven van slot
}
func main() {
var wg sync.WaitGroup
files := []string{"file1.txt", "file2.txt" /* enz. */}
for _, path := range files {
wg.Add(1)
go func(p string) {
defer wg.Done()
f, err := openFile(p)
if err != nil {
fmt.Println("Fout bij openen bestand:", err)
return
}
defer closeFile(f)
// Werk met het bestand
}(path)
}
wg.Wait()
}
Deze aanpak helpt het aantal gelijktijdig geopende bestanden te controleren en systeemlimieten te voorkomen.