Sobes.tech
Junior — Middle

Hoe voorkom je dat het limiet van open bestandsbeschrijvingen in het systeem wordt overschreden?

sobes.tech AI

Antwoord van AI

Om het overschrijden van de limiet van open bestand descriptors in het systeem in Go te voorkomen, kunnen verschillende benaderingen worden gebruikt:

  1. Beperk het aantal gelijktijdig geopende bestanden — implementeer een descriptor pool of een semaphore die het aantal geopende bestanden controleert.

  2. Sluit bestanden onmiddellijk na gebruik — roep altijd file.Close() aan in defer direct na het openen van het bestand, om resources vrij te maken.

  3. Controleer en verhoog de systeemlimieten — met systeemoproepen (bijvoorbeeld ulimit in Unix) kan het maximale aantal open bestanden worden verhoogd.

Voorbeeld van het gebruik van een semaphore om het aantal geopende bestanden te beperken:

package main

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

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

func openFile(path string) (*os.File, error) {
    sem <- struct{}{} // neem een slot
    f, err := os.Open(path)
    if err != nil {
        <-sem // vrijgeven van slot bij fout
        return nil, err
    }
    return f, nil
}

func closeFile(f *os.File) {
    f.Close()
    <-sem // vrijgeven van slot
}

func main() {
    var wg sync.WaitGroup
    files := []string{"file1.txt", "file2.txt" /* enz. */}

    for _, path := range files {
        wg.Add(1)
        go func(p string) {
            defer wg.Done()
            f, err := openFile(p)
            if err != nil {
                fmt.Println("Fout bij openen bestand:", err)
                return
            }
            defer closeFile(f)

            // Werk met het bestand
        }(path)
    }

    wg.Wait()
}

Deze aanpak helpt het aantal gelijktijdig geopende bestanden te controleren en systeemlimieten te voorkomen.