Конкурентность
Тема дорожной карты · Golang
Конкурентность в Go — полноценная возможность языка, построенная вокруг goroutines и каналов, позволяющая легко писать программы, выполняющие множество задач одновременно без сложности традиционных многопоточных моделей. Goroutine запускается с ключевым словом go и работает конкурентно с вызывающим кодом, планируясь M:N-планировщиком среды выполнения Go, а не операционной системой, — поэтому тысячи goroutines могут сосуществовать с минимальными накладными расходами по памяти. Каналы обеспечивают типизированную и безопасную коммуникацию между goroutines, а пакет sync предоставляет низкоуровневые примитивы — sync.Mutex, sync.RWMutex, sync.WaitGroup и sync.Once — для случаев, когда разделяемого состояния не избежать. Оператор select позволяет goroutine ожидать нескольких операций с каналами одновременно — это базовый блок для таймаутов, отмены через context.Context, fan-in конвейеров и паттернов пулов воркеров. Встроенный race detector в Go (go test -race или go run -race) обнаруживает гонки данных во время выполнения и является незаменимым инструментом для проверки конкурентного Golang-кода перед развёртыванием в Kubernetes.
Как это работает
Конкурентность построен на goroutines (лёгкие green threads, мультиплексируемые на OS-потоки Go-runtime) и channels (типизированные каналы для сообщений между goroutines). go funcName() запускает goroutine; ch <- value шлёт; value := <-ch принимает. select ждёт на нескольких каналах; context.Context несёт cancellation + дедлайны через дерево вызовов. sync.Mutex, sync.WaitGroup, sync.Once, атомарные примитивы, errgroup для группировки goroutines.
Когда применять
Goroutines используйте свободно — дёшевы (~2-4KB stack начально, растёт по нужде). Всегда имейте способ остановить goroutine (cancellation context.Context, close канала, deadline) — утёкшие goroutines = тихий рост памяти. Context первым аргументом — в любую функцию с I/O. sync.Mutex — для shared state, когда channels неудобны. errgroup — для "fan out, wait, первая ошибка пробрасывается".
Типичные ошибки
Ловушки Конкурентность: утечки goroutines (goroutine ждёт навеки на канале, в который никто не пишет); data race на shared map без mutex (race detector ловит: go test -race); deadlock (go test -race НЕ ловит deadlock — осторожно); не пробрасывают context.Context, и cancellation не доходит до глубокого вызова.
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…