Come garantire la prevenzione del superamento del limite dei descrittori di file aperti nel sistema?
sobes.tech AI
Risposta dell'AI
Per evitare di superare il limite dei descrittori di file aperti nel sistema in Go, si possono adottare diversi approcci:
-
Limitare il numero di file aperti contemporaneamente — implementare un pool di descrittori o un semaforo che controlli il numero di file aperti.
-
Chiudere i file subito dopo l'uso — chiamare sempre
file.Close()indefersubito dopo aver aperto il file, per garantire il rilascio delle risorse. -
Verificare e aumentare i limiti del sistema operativo — tramite chiamate di sistema (ad esempio,
ulimitin Unix), si può aumentare il numero massimo di file aperti.
Esempio di utilizzo di un semaforo per limitare i file aperti:
package main
import (
"fmt"
"os"
"sync"
)
var maxOpenFiles = 100
var sem = make(chan struct{}, maxOpenFiles)
func openFile(path string) (*os.File, error) {
sem <- struct{}{} // acquisire uno slot
f, err := os.Open(path)
if err != nil {
<-sem // rilasciare lo slot in caso di errore
return nil, err
}
return f, nil
}
func closeFile(f *os.File) {
f.Close()
<-sem // rilasciare lo slot
}
func main() {
var wg sync.WaitGroup
files := []string{"file1.txt", "file2.txt" /* ecc. */}
for _, path := range files {
wg.Add(1)
go func(p string) {
defer wg.Done()
f, err := openFile(p)
if err != nil {
fmt.Println("Errore nell'apertura del file:", err)
return
}
defer closeFile(f)
// Lavorare con il file
}(path)
}
wg.Wait()
}
Questo approccio aiuta a controllare il numero di file aperti contemporaneamente e a prevenire il superamento dei limiti di sistema.