Что такое конкурентность (concurrency) и чем она отличается от параллелизма (parallelism)?

Ответ

Это фундаментальные концепции в разработке, которые часто путают. В Go они играют ключевую роль.

Конкурентность (Concurrency) — это структура программы, позволяющая управлять множеством задач одновременно. Задачи могут выполняться вперемешку, не обязательно в один и тот же момент времени.

Аналогия: один человек жонглирует несколькими мячами. Он работает с каждым мячом по очереди, но создает видимость одновременной работы со всеми.

Параллелизм (Parallelism) — это исполнение нескольких задач в один и тот же физический момент времени. Для этого требуется многоядерный процессор.

Аналогия: несколько человек, каждый из которых жонглирует одним мячом. Работа происходит действительно одновременно.

Связь в Go:

  • Go достигает конкурентности с помощью горутин (goroutines) — легковесных потоков, управляемых средой выполнения Go, а не операционной системой.
  • Планировщик Go (Go Scheduler) распределяет эти горутины по реальным потокам ОС.
  • Если у вас один поток ОС (или одно ядро процессора), вы получаете конкурентность без параллелизма (псевдопараллельность). Горутины выполняются поочередно, быстро переключаясь.
  • Если у вас несколько ядер, планировщик может запустить несколько горутин на разных ядрах параллельно.
package main

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

func task(name string) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Task %s: step %dn", name, i)
        // Даем планировщику возможность переключить контекст
        runtime.Gosched()
    }
}

func main() {
    // Позволяем Go использовать все доступные ядра для параллелизма
    runtime.GOMAXPROCS(runtime.NumCPU())

    go task("A") // Запускаем конкурентную задачу
    go task("B") // И еще одну

    // Ждем, чтобы горутины успели выполниться
    time.Sleep(time.Second)
}

Вывод будет перемешан, так как задачи выполняются конкурентно и, возможно, параллельно.