Sobes.tech
Junior — Middle

Kako osigurati sprečavanje prekoračenja limita otvorenih deskriptora fajlova u sistemu?

sobes.tech АИ

Одговор од АИ

Da biste sprečili prekoračenje limita otvorenih deskriptora fajlova u sistemu u Go, možete koristiti nekoliko pristupa:

  1. Ograničite broj istovremeno otvorenih fajlova — implementirajte bazen deskriptora ili semafor koji kontroliše broj otvorenih fajlova.

  2. Zatvarajte fajlove odmah nakon upotrebe — uvek pozivajte file.Close() u defer odmah nakon otvaranja fajla, kako biste osigurali oslobađanje resursa.

  3. Proverite i povećajte limite OS-a — pomoću sistemskih poziva (npr. ulimit u Unix-u) možete povećati maksimalni dozvoljeni broj otvorenih fajlova.

Primer korišćenja semafora za ograničenje otvorenih fajlova:

package main

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

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

func openFile(path string) (*os.File, error) {
    sem <- struct{}{} // zauzmi slot
    f, err := os.Open(path)
    if err != nil {
        <-sem // oslobodi slot u slučaju greške
        return nil, err
    }
    return f, nil
}

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

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

    for _, path := range files {
        wg.Add(1)
        go func(p string) {
            defer wg.Done()
            f, err := openFile(p)
            if err != nil {
                fmt.Println("Greška pri otvaranju fajla:", err)
                return
            }
            defer closeFile(f)

            // Rad sa fajlom
        }(path)
    }

    wg.Wait()
}

Ovaj pristup pomaže da se kontroliše broj istovremeno otvorenih fajlova i spreči prekoračenje sistemskih limita.