Sobes.tech
Senior

Co się stanie, jeśli uruchomimy 5 bilionów goroutine? Jak zoptymalizować?

sobes.tech AI

Odpowiedź od AI

Uruchomienie 5 bilionów goroutine jest niemożliwe w praktyce ze względu na ograniczenia pamięci i zasobów systemu operacyjnego. Goroutines są lekkie, ale każda wymaga stosu (domyślnie ~2KB), co doprowadzi do wyczerpania pamięci.

Co się stanie:

  • Pamięć szybko się wyczerpie, a program zakończy się błędem.
  • Wydajność znacznie spadnie z powodu przełączania kontekstu.

Jak zoptymalizować:

  • Używać puli goroutine (worker pool), ograniczając liczbę jednocześnie działających goroutine.
  • Dzielić zadania na mniejsze partie i przetwarzać je kolejno lub równolegle z kontrolą liczby goroutine.
  • Używać kanałów do zarządzania obciążeniem i synchronizacji.
  • Przejrzeć logikę: być może nie potrzebujesz aż takiego paralelizmu.

Przykład puli 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)

W ten sposób kontrolujemy liczbę goroutine i unikamy wyczerpania zasobów.