Sobes.tech
Senior

Šta će se desiti ako pokrenemo 5 triliona goroutines? Kako optimizovati?

sobes.tech АИ

Одговор од АИ

Pokretanje 5 triliona goroutine nije moguće u praksi zbog ograničenja memorije i resursa operativnog sistema. Goroutine su lagane, ali svaka zahteva stog (podrazumevano ~2KB), što će dovesti do iscrpljenja memorije.

Šta će se desiti:

  • Memorija će se brzo istrošiti, a program će se srušiti sa greškom.
  • Performanse će se znatno smanjiti zbog prebacivanja konteksta.

Kako optimizovati:

  • Koristiti bazen radnika (worker pool), ograničavajući broj istovremeno aktivnih goroutine.
  • Podeliti zadatke na manje partije i obrađivati ih redom ili paralelno sa kontrolom broja goroutine.
  • Koristiti kanale za upravljanje opterećenjem i sinhronizaciju.
  • Preispitati logiku: možda nije potrebno toliko paralelizma.

Primer bazena goroutine:

const workerCount = 100
jobs := make(chan Job)

for i := 0; i < workerCount; i++ {
    go func() {
        for job := range jobs {
            process(job)
        }
    }()
}

for _, job := range allJobs {
    jobs <- job
}
close(jobs)

Na ovaj način kontrolišemo broj goroutine-a i izbegavamo iscrpljivanje resursa.