Назад к урокам

Конкурентное программирование в Go

Урок объясняет базовые принципы конкурентности в Go: разницу между потоками и асинхронностью, недетерминированность выполнения, распределение задач между ядрами процессора и то, как Go автоматически управляет конкурентным кодом.

Начинающий12 min

⚙️ Конкурентное программирование в Go

Конкурентность --- это возможность выполнять несколько задач одновременно. Go делает это проще благодаря встроенным примитивам и автоматическому управлению планировщиком.


🧵 Что такое конкурентность?

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

  • параллельно --- одновременно на разных ядрах процессора,
  • асинхронно --- выполнение может приостанавливаться и возобновляться.

Go автоматически решает, какой режим использовать.


🧠 Потоки (threaded execution)

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

  • Каждое ядро выполняет свой фрагмент
  • Планировщик Go распределяет задачи между ядрами самостоятельно

🔄 Асинхронное выполнение

Асинхронный код способен:

  • приостанавливаться,
  • освобождать поток,
  • возобновляться позже.

Пока одна задача ждёт (например, сеть или диск), другие продолжают выполняться.


🎲 Недетерминированность

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

Конкурентный код:

  • выполняется не по порядку,
  • результаты могут зависеть от планировщика,
  • требует синхронизации, если нужен строгий порядок.

🚀 Почему конкурентность полезна?

  • Полное использование всех доступных CPU-ресурсов
  • Параллелизация вычислений
  • Асинхронное выполнение операций ввода-вывода
  • Возможность эффективной обработки множества задач одновременно

🧰 Как работает конкурентность в Go?

Go предоставляет универсальный механизм, который скрывает различия между потоками и асинхронностью. Программист работает с горутиной --- лёгкой задачей, запускаемой через go:

go doWork()

Go решает:

  • запускать это параллельно,
  • или асинхронно,
  • или переключать задачи между потоками.

💡 Итоги

  • Конкурентность позволяет выполнять несколько задач одновременно.
  • Может работать через параллелизм (несколько ядер) или асинхронность (ожидание/возобновление).
  • Go автоматически управляет потоками и переключением задач.
  • Конкурентный код недетерминированный, требует синхронизации при необходимости порядка.
  • Используется для производительности, ввода-вывода и распределённых вычислений.