Ответ
Это фундаментальные концепции в разработке, которые часто путают. В 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)
}
Вывод будет перемешан, так как задачи выполняются конкурентно и, возможно, параллельно.