Шаблоны конвейеров и этапов
Составление конкурентных конвейеров из нескольких этапов
«Шаблоны конвейеров и этапов» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое конвейер
Параллельный конвейер — это последовательность этапов, соединённых каналами. Каждый этап получает значения от предыдущего, преобразует их и отправляет результаты следующему, позволяя этапам выполняться параллельно.
Простой конвейер из трёх этапов
Генерация → преобразование → обработка:
func generate(nums ...int) <-chan int {
out := make(chan int)
go func() { defer close(out); for _, n := range nums { out <- n } }()
return out
}
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() { defer close(out); for n := range in { out <- n*n } }()
return out
}
for v := range square(generate(2, 3, 4)) {
fmt.Println(v) // 4, 9, 16
}Шаблон этапов
Каждый этап — это функция, которая принимает входной канал и возвращает выходной канал. Этапы легко объединять, а выполнять их параллельно можно независимо друг от друга.
Разветвление внутри конвейера
Разделите этап на N горутин, чтобы выполнять работу с высокой нагрузкой на CPU параллельно:
func parallelSquare(in <-chan int, n int) <-chan int {
outs := make([]<-chan int, n)
for i := 0; i < n; i++ {
outs[i] = square(in) // all read from same in
}
return merge(outs...)
}Отмена с помощью контекста
Передавайте контекст каждому этапу. При его отмене этапы прекращают чтение и закрывают свои выходные каналы, опустошая весь конвейер.
func stage(ctx context.Context, in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for {
select {
case v, ok := <-in:
if !ok { return }
select {
case out <- process(v):
case <-ctx.Done(): return
}
case <-ctx.Done(): return
}
}
}()
return out
}Обратное давление
Используйте буферизованные каналы между этапами, чтобы отделить скорости производителя и потребителя. Без буферизации медленный этап останавливает весь конвейер.
out := make(chan Result, 50) // buffer 50 resultsПередача ошибок
Оборачивайте значения в структуру результата, чтобы передавать ошибки через конвейер без паники:
type item struct { val int; err error }Шаблон канала Done
Используйте канал done вместо контекста в более простых конвейерах. Закройте done, чтобы подать всем этапам сигнал остановки.
done := make(chan struct{})
defer close(done)Гарантии порядка
Простой конвейер сохраняет порядок, если каждый этап выполняется последовательно. Параллельные этапы порядок не сохраняют — при необходимости используйте поле с индексом, чтобы восстановить порядок результатов на последующих этапах.
Конвейер с WaitGroup
Последнему этапу не нужно закрывать канал — просто перебирайте его значения в цикле. Используйте WaitGroup при объединении потоков, чтобы закрыть объединённый канал после завершения всех горутин-производителей.
Применение на практике
Распространённые применения конвейеров: обработка данных ETL, изменение размера изображений, разбор журналов, системы сборки и обработчики потоковых запросов.
Быстрая проверка
Как передать отмену через многоэтапный конвейер?
Повторение: шаблон конвейера
Основные моменты:
- Этап: func(in <-chan T) <-chan U — объединяйте этапы в конвейеры
- Отмена выполняется через контекст; обратное давление — через буферизованные каналы
- Разветвляйте этап для параллельного выполнения
- Оборачивайте значения в структуру результата для передачи ошибок
Часто задаваемые вопросы
Урок «Шаблоны конвейеров и этапов» бесплатный?
Да — полный текст урока «Шаблоны конвейеров и этапов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблоны конвейеров и этапов»?
Составление конкурентных конвейеров из нескольких этапов Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Шаблоны конвейеров и этапов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Шаблоны конвейеров и этапов
- errgroup для конкурентной обработки ошибок
- Шаблон семафора
- Обнаружение утечек и отмена