Ответ
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)
}