Sobes.tech
Junior — Middle

Cum se asigură prevenirea depășirii limitei de descriptor de fișiere deschise în sistem?

sobes.tech AI

Răspuns de la AI

Pentru a preveni depășirea limitei descriptorilor de fișiere deschiși în sistem în Go, se pot folosi mai multe abordări:

  1. Limitarea numărului de fișiere deschise simultan — implementarea unui pool de descriptor sau a unui semafor care controlează numărul de fișiere deschise.

  2. Închiderea fișierelor imediat după utilizare — întotdeauna apelați file.Close() în defer chiar după deschiderea fișierului, pentru a asigura eliberarea resurselor.

  3. Verificarea și creșterea limitelor sistemului de operare — prin apeluri de sistem (de exemplu, ulimit în Unix), se poate crește numărul maxim permis de fișiere deschise.

Exemplu de utilizare a unui semafor pentru limitarea fișierelor deschise:

package main

import (
    "fmt"
    "os"
    "sync"
)

var maxOpenFiles = 100
var sem = make(chan struct{}, maxOpenFiles)

func openFile(path string) (*os.File, error) {
    sem <- struct{}{} // ocupă un slot
    f, err := os.Open(path)
    if err != nil {
        <-sem // eliberează slotul în caz de eroare
        return nil, err
    }
    return f, nil
}

func closeFile(f *os.File) {
    f.Close()
    <-sem // eliberează slotul
}

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("Eroare la deschiderea fișierului:", err)
                return
            }
            defer closeFile(f)

            // Lucru cu fișierul
        }(path)
    }

    wg.Wait()
}

Această abordare ajută la controlul numărului de fișiere deschise simultan și previne depășirea limitelor sistemului.