Sobes.tech
Junior — Middle

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:

  1. 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.

  2. Fechar os ficheiros imediatamente após uso — sempre chamar file.Close() em defer logo após abrir o ficheiro, para garantir a libertação de recursos.

  3. Verificar e aumentar os limites do sistema operativo — através de chamadas ao sistema (por exemplo, ulimit no 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.