Ответ
Паттерн «Конвейер» (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
}
}
Преимущества паттерна:
- Параллелизм: Каждый этап работает параллельно, что увеличивает пропускную способность.
- Разделение логики: Код становится более чистым, модульным и легким для понимания.
- Расширяемость: В конвейер легко добавлять новые этапы обработки.