Материал проходит вычитку — возможны неточности.
Урок 78 из 118

Буферизованный канал

На пиковых загрузках конвейер дёргался: стоило шагу разбора притормозить, и вся цепочка замирала. Миша поставил между шагами буферы-очереди, и предыдущий шаг смог убегать вперёд на запас — пики сгладились. Аня на ревью отметила: буфер лишь отложил блокировку, но не вылечил перегрузку.

Главная мысль

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

Буфер — очередь

<!-- wp:code-run/run {"code":"ch := make(chan int, 3)\n\nch <- 1\nch <- 2\nch <- 3 // буфер заполнен\n// ch <- 4 — заблокируется: места нет\n\nfmt.Println(<-ch, <-ch,

Буферизованный канал — это очередь фиксированной длины. Пока есть место, отправка не блокируется; приём блокируется на пустом буфере. Порядок — FIFO.

Буфер сглаживает производителя

ch := make(chan File, 10)

go func() { // шаг конвейера-производитель
    for _, f := range batch {
        ch <- f // блокируется только когда буфер полон
    }
    close(ch)
}()

for f := range ch { // следующий шаг-потребитель
    process(f)
}

Буфер на 10 позволяет производителю убежать вперёд на 10 файлов, сглаживая неровности поступления работы на пиках загрузки. Это обратное давление с запасом: небуферизованный канал даёт жёсткую синхронизацию, буфер — свободный ход до ёмкости.

Буфер — не кэш

Распространённая ошибка — использовать буфер как «чтобы не блокировалось». Это неверно: буфер задерживает блокировку, но не убирает её. Если производитель стабильно быстрее потребителя, любой буфер в итоге заполнится. Ёмкость выбирают осознанно — как величину допустимого отставания, а не как лекарство от перегрузки.

Вы узнаете:

  • как буфер на N работает семафором
  • что дают cap(ch) и len(ch)

Буфер — очередь фиксированной длины: блокировки только на краях (полный/пустой). Буфер — управляемый запас отставания, не кэш-панацея.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки