Конкурентно, асинхронно или параллельно работает Go

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

Ответ

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

Пример:

func main() {
    go func() { fmt.Println("Горутина 1") }()
    go func() { fmt.Println("Горутина 2") }()
    time.Sleep(time.Millisecond) // Даем горутинам время выполниться
}

Ключевые моменты:

  • Конкурентность: Горутины выполняются независимо, переключаясь при блокировке (I/O, каналы).
  • Параллелизм: На multi-core CPU горутины работают одновременно.
  • Асинхронность: Неблокирующие операции (например, select с каналами).

Планировщик распределяет горутины по потокам ОС (обычно 1 поток на ядро).