Sobes.tech
Junior — Middle

Jakie będą konsekwencje dla działania programu przy ustawieniu GOMAXPROCS na 1 i uruchomieniu nieskończonej goroutine?

sobes.tech AI

Odpowiedź od AI

Ustawienie GOMAXPROCS na 1 ogranicza liczbę wątków systemu operacyjnego, które może używać planista Go, do jednego wątku. Jeśli w tym scenariuszu uruchomiona zostanie nieskończona gorutyna:

  • Wszystkie obliczenia będą wykonywane kolejno na jednym wątku.
  • Jeśli nieskończona gorutyna nie zawiera punktów, w których dochodzi do przełączania kontekstu (np. wywołania operacji blokujących lub runtime.Gosched()), inne gorutyny mogą nie uzyskać czasu na wykonanie, co spowoduje "zawieszenie" programu.
  • W efekcie program może przestać odpowiadać lub działać bardzo wolno, ponieważ planista nie będzie mógł efektywnie przełączać się między gorutynami.

Przykład:

package main

import (
    "runtime"
    "time"
    "fmt"
)

func main() {
    runtime.GOMAXPROCS(1)

    go func() {
        for {
            // nieskończona pętla bez wywołania runtime.Gosched()
        }
    }()

    time.Sleep(time.Second)
    fmt.Println("Program zakończony")
}

W tym przykładzie główna gorutyna może nie uzyskać czasu na wykonanie, jeśli nieskończona gorutyna nie ustępuje kontroli, co spowoduje "zawieszenie" programu.