Введение в конкурентность
Конкурентность в 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, не усложняйте код каналами ради канонов.