В этой теме ты научишься связывать конкурентный код с его синхронизацией: кто владеет данными, кто ждёт и как работа завершается.
Разберём, как горутина попадает на поток ОС и почему число goroutine не равно числу потоков. Затем проследим блокировки и роль P в исполнении Go-кода.
Проследим send, receive и close для buffered и unbuffered каналов. Отдельно определим, какая сторона знает, когда отправок больше не будет.
Разберём готовность веток select, поведение nil-канала и цену default в polling loop.
Выберем Mutex, WaitGroup или atomic по тому, какой инвариант нужно сохранить между goroutine.
Проследим отмену и deadline от родителя к дочернему context и дальше до исходящего вызова.
Отделим data race от логической ошибки порядка и разберём, что способен обнаружить race detector.
Соберём worker pool и pipeline с ограниченной нагрузкой, отменой и понятным владельцем закрытия каналов.