Введение в конкурентность

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

Главная сложность не в запуске go func(). Запустить горутину легко. Сложнее понять, кто владеет данными, кто останавливает работу, где проходит граница ответственности и как не оставить фоновый процесс жить после того, как он уже никому не нужен.


Что будет внутри

  • горутины и каналы как базовая модель коммуникации;
  • sync: Mutex, RWMutex, WaitGroup, Once, атомики;
  • context: отмена, таймауты, propagation через вызовы;
  • планировщик Go и то, почему горутины дешевле OS threads;
  • практические паттерны: worker pool, pipeline, fan-out/fan-in;
  • lock-free подходы и границы их применимости.

Как понять, что модуль освоен

Вы можете объяснить, как горутина завершится, что произойдёт при закрытии канала, где нужна блокировка, а где лучше передать данные через канал. Вы не используете конкурентность "на всякий случай" и умеете видеть цену каждого параллельного участка.

Особенно важный навык: читать код и находить места, где возможны race condition, deadlock или утечка горутин.


Рабочие ориентиры

  • У каждой горутины должен быть понятный владелец и понятный способ завершиться.
  • Канал передаёт не только данные, но и право продолжить работу.
  • Если общий mutable state проще защитить Mutex, не усложняйте код каналами ради канонов.