Como garantir a prevenção de ultrapassar o limite de descritores de ficheiros abertos no sistema?
sobes.tech IA
Resposta da IA
Para evitar ultrapassar o limite de descritores de ficheiros abertos no sistema em Go, podem ser utilizados vários métodos:
-
Limitar o número de ficheiros abertos simultaneamente — implementar um grupo de descritores ou um semáforo que controle o número de ficheiros abertos.
-
Fechar os ficheiros imediatamente após uso — sempre chamar
file.Close()emdeferlogo após abrir o ficheiro, para garantir a libertação de recursos. -
Verificar e aumentar os limites do sistema operativo — através de chamadas ao sistema (por exemplo,
ulimitno Unix), é possível aumentar o número máximo de ficheiros abertos.
Exemplo de uso de um semáforo para limitar ficheiros abertos:
package main
import (
"fmt"
"os"
"sync"
)
var maxOpenFiles = 100
var sem = make(chan struct{}, maxOpenFiles)
func openFile(path string) (*os.File, error) {
sem <- struct{}{} // adquirir um espaço
f, err := os.Open(path)
if err != nil {
<-sem // libertar espaço em caso de erro
return nil, err
}
return f, nil
}
func closeFile(f *os.File) {
f.Close()
<-sem // libertar espaço
}
func main() {
var wg sync.WaitGroup
files := []string{"file1.txt", "file2.txt" /* etc. */}
for _, path := range files {
wg.Add(1)
go func(p string) {
defer wg.Done()
f, err := openFile(p)
if err != nil {
fmt.Println("Erro ao abrir ficheiro:", err)
return
}
defer closeFile(f)
// Trabalhar com o ficheiro
}(path)
}
wg.Wait()
}
Esta abordagem ajuda a controlar o número de ficheiros abertos simultaneamente e evita ultrapassar os limites do sistema.