Всегда ли горутины выполняются параллельно

«Всегда ли горутины выполняются параллельно» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, горутины не всегда выполняются параллельно. Они работают конкурентно, но параллелизм зависит от количества доступных ядер CPU и настройки среды выполнения Go (GOMAXPROCS).

  • Одно ядро: Горутины выполняются конкурентно, переключаясь на одном ядре.
  • Несколько ядер: Горутины могут выполняться параллельно, если GOMAXPROCS > 1.

Пример:

func main() {
    runtime.GOMAXPROCS(1) // Ограничиваем одним ядром
    go func() { fmt.Println("Горутина 1") }()
    go func() { fmt.Println("Горутина 2") }()
    time.Sleep(time.Second)
}

Даже с двумя горутинами, при GOMAXPROCS=1, они выполнятся конкурентно, но не параллельно.