Что такое паттерн «Конвейер» (Pipeline) в Go?

Ответ

Паттерн «Конвейер» (Pipeline) — это модель конкурентного программирования, в которой серия задач обрабатывается последовательно. Каждая задача (этап конвейера) выполняется в отдельной горутине, а данные передаются между этапами через каналы.

Каждый этап конвейера получает данные из входного канала, обрабатывает их и отправляет результат в выходной канал. Это позволяет эффективно распараллеливать обработку потока данных.

Пример конвейера из двух этапов:

package main

import "fmt"

// Этап 1: генерирует числа и отправляет их в канал
func producer(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

// Этап 2: получает числа из канала, возводит в квадрат и отправляет дальше
func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

func main() {
    // Собираем конвейер
    source := producer(1, 2, 3, 4)
    result := square(source)

    // Читаем и выводим результаты
    for res := range result {
        fmt.Println(res) // Выведет 1, 4, 9, 16
    }
}

Преимущества паттерна:

  • Параллелизм: Каждый этап работает параллельно, что увеличивает пропускную способность.
  • Разделение логики: Код становится более чистым, модульным и легким для понимания.
  • Расширяемость: В конвейер легко добавлять новые этапы обработки.