Junior — Middle
Kako osigurati sprečavanje prekoračenja limita otvorenih deskriptora fajlova u sistemu?
sobes.tech АИ
Одговор од АИ
Da biste sprečili prekoračenje limita otvorenih deskriptora fajlova u sistemu u Go, možete koristiti nekoliko pristupa:
-
Ograničite broj istovremeno otvorenih fajlova — implementirajte bazen deskriptora ili semafor koji kontroliše broj otvorenih fajlova.
-
Zatvarajte fajlove odmah nakon upotrebe — uvek pozivajte
file.Close()udeferodmah nakon otvaranja fajla, kako biste osigurali oslobađanje resursa. -
Proverite i povećajte limite OS-a — pomoću sistemskih poziva (npr.
ulimitu Unix-u) možete povećati maksimalni dozvoljeni broj otvorenih fajlova.
Primer korišćenja semafora za ograničenje otvorenih fajlova:
package main
import (
"fmt"
"os"
"sync"
)
var maxOpenFiles = 100
var sem = make(chan struct{}, maxOpenFiles)
func openFile(path string) (*os.File, error) {
sem <- struct{}{} // zauzmi slot
f, err := os.Open(path)
if err != nil {
<-sem // oslobodi slot u slučaju greške
return nil, err
}
return f, nil
}
func closeFile(f *os.File) {
f.Close()
<-sem // oslobodi slot
}
func main() {
var wg sync.WaitGroup
files := []string{"file1.txt", "file2.txt" /* itd. */}
for _, path := range files {
wg.Add(1)
go func(p string) {
defer wg.Done()
f, err := openFile(p)
if err != nil {
fmt.Println("Greška pri otvaranju fajla:", err)
return
}
defer closeFile(f)
// Rad sa fajlom
}(path)
}
wg.Wait()
}
Ovaj pristup pomaže da se kontroliše broj istovremeno otvorenih fajlova i spreči prekoračenje sistemskih limita.