Junior — Middle
Jak zajistit prevenci před překročením limitu otevřených deskriptorů souborů v systému?
sobes.tech AI
Odpověď od AI
Abychom zabránili překročení limitu otevřených deskriptorů souborů v systému v jazyce Go, lze použít několik přístupů:
-
Omezit počet současně otevřených souborů — implementovat bazén deskriptorů nebo semafor, který kontroluje počet otevřených souborů.
-
Okamžitě zavřít soubory po použití — vždy volat
file.Close()vdeferihned po otevření souboru, aby se zajistilo uvolnění zdrojů. -
Zkontrolovat a zvýšit limity OS — pomocí systémových volání (například
ulimitv Unixu) lze zvýšit maximální počet otevřených souborů.
Příklad použití semaforu ke snížení počtu otevřených souborů:
package main
import (
"fmt"
"os"
"sync"
)
var maxOpenFiles = 100
var sem = make(chan struct{}, maxOpenFiles)
func openFile(path string) (*os.File, error) {
sem <- struct{}{} // získat místo
f, err := os.Open(path)
if err != nil {
<-sem // uvolnit místo při chybě
return nil, err
}
return f, nil
}
func closeFile(f *os.File) {
f.Close()
<-sem // uvolnit místo
}
func main() {
var wg sync.WaitGroup
files := []string{"file1.txt", "file2.txt" /* atd. */}
for _, path := range files {
wg.Add(1)
go func(p string) {
defer wg.Done()
f, err := openFile(p)
if err != nil {
fmt.Println("Chyba při otevírání souboru:", err)
return
}
defer closeFile(f)
// Práce se souborem
}(path)
}
wg.Wait()
}
Tento přístup pomáhá kontrolovat počet současně otevřených souborů a zabraňuje překročení systémových limitů.