Опишите, как в Go реализованы конкурентность, параллелизм и асинхронность.

Ответ

Go — это конкурентный язык по своей природе. Эти три понятия тесно связаны, но различны:


  • Конкурентность (Concurrency) — это способность структурировать программу как набор независимо выполняющихся процессов. В Go это достигается с помощью горутин (goroutines). Горутины — это легковесные потоки, управляемые средой выполнения Go, а не операционной системой. Их можно запустить тысячами без существенных накладных расходов.



  • Параллелизм (Parallelism) — это одновременное выполнение нескольких задач. Если у вас многоядерный процессор, планировщик Go (Go scheduler) может распределить горутины по разным ядрам, и они будут выполняться параллельно. Таким образом, параллелизм — это частный случай реализации конкурентности на многоядерном оборудовании.



  • Асинхронность (Asynchronicity) — это выполнение операций без блокировки основного потока. В Go асинхронность достигается через конкурентность. Вместо колбэков, как в других языках, Go использует каналы (channels) для безопасного обмена данными между горутинами и оператор select для ожидания данных из нескольких каналов без блокировки.


Краткий итог: Go предоставляет инструменты для конкурентного дизайна (горутины и каналы), что позволяет достичь параллельного выполнения на многоядерных системах и реализовать асинхронные операции.

package main

import (
    "fmt"
    "time"
)

func main() {
    // Запускаем две горутины конкурентно.
    // На многоядерной системе они могут выполниться параллельно.
    go func() { fmt.Println("Горутина 1") }()
    go func() { fmt.Println("Горутина 2") }()

    // Даем планировщику время на запуск горутин
    time.Sleep(time.Millisecond)
}