0Pricing
Go Academy · Урок

Шаблоны конвейеров и этапов

Составление конкурентных конвейеров из нескольких этапов

«Шаблоны конвейеров и этапов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Шаблоны конвейеров и этапов
  2. errgroup для конкурентной обработки ошибок
  3. Шаблон семафора
  4. Обнаружение утечек и отмена
← Назад к Go Academy