Буферизованный канал
На пиковых загрузках конвейер дёргался: стоило шагу разбора притормозить, и вся цепочка замирала. Миша поставил между шагами буферы-очереди, и предыдущий шаг смог убегать вперёд на запас — пики сгладились. Аня на ревью отметила: буфер лишь отложил блокировку, но не вылечил перегрузку.
буферизованный канал — очередь фиксированной длины: отправка блокируется только на полном буфере, приём — на пустом.
Буфер — очередь
<!-- 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)
Буфер — очередь фиксированной длины: блокировки только на краях (полный/пустой). Буфер — управляемый запас отставания, не кэш-панацея.
10 000 ₽ · 60 минут · онлайн