Конкурентность

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

  1. 2.1 Горутины и планировщик

    Разберём, как горутина попадает на поток ОС и почему число goroutine не равно числу потоков. Затем проследим блокировки и роль P в исполнении Go-кода.

  2. 2.2 Каналы

    Проследим send, receive и close для buffered и unbuffered каналов. Отдельно определим, какая сторона знает, когда отправок больше не будет.

  3. 2.3 select

    Разберём готовность веток select, поведение nil-канала и цену default в polling loop.

  4. 2.4 Примитивы синхронизации: sync и atomic

    Выберем Mutex, WaitGroup или atomic по тому, какой инвариант нужно сохранить между goroutine.

  5. 2.5 context

    Проследим отмену и deadline от родителя к дочернему context и дальше до исходящего вызова.

  6. 2.6 Проблемы: гонки, дедлоки, утечки

    Отделим data race от логической ошибки порядка и разберём, что способен обнаружить race detector.

  7. 2.7 Конкурентные паттерны

    Соберём worker pool и pipeline с ограниченной нагрузкой, отменой и понятным владельцем закрытия каналов.