常见模式之三:流水线/管道模式
定义
顾名思义,就是数据处理需要经历多个流水线工序,工序依次执行
使用场景
-
除了第一道工序依赖用户输入,后面的每道工序都依赖前一道工序的输出
-
每道工序独立处理数据,顺序流转到下一道
-
使用场景包括对数据批量的加权打分、过滤器等等
示例
假设,我们要对一批数据进行 乘2 然后 加3,最后减四,模拟流水线3道工序,打印最后结果
package main
import (
"fmt"
"time"
)
func process1(data []int) <-chan int {
res := make(chan int)
go func() {
defer close(res)
time.Sleep(time.Millisecond * 30)
for _, v := range data {
res <- v * 2
}
}()
return res
}
func process2(in <-chan int) <-chan int {
res := make(chan int)
go func() {
defer close(res)
time.Sleep(time.Millisecond * 30)
for v := range in {
res <- v + 3
}
}()
return res
}
func process3(in <-chan int) <-chan int {
res := make(chan int)
go func() {
defer close(res)
time.Sleep(time.Millisecond * 30)
for v := range in {
res <- v - 4
}
}()
return res
}
func main() {
data := []int{2, 3, 4, 5}
p1 := process1(data)
p2 := process2(p1)
p3 := process3(p2)
for v := range p3 {
fmt.Println(v)
}
}