在现实世界中,经常有一些工作是属于流水线类型的,它们每一个步骤都是紧密关联的,第一步先做什么,再做做么,最后做什么。特别是制造业这个行业,基本全是流水线生产车间。在我们开发中也经常遇到这类的业务场景。
假如我们有个流水线共分三个步骤,分别是 job1、job2和job3。代码:https://play.golang.org/p/e7ZlP9ofXB3
package main import ( "fmt" "time" ) func job1(count int) <-chan int { outCh := make(chan int, 2) go func() { defer close(outCh) for i := 0; i < count; i++ { time.Sleep(time.Second) fmt.Println("job1 finish:", 1) outCh <- 1 } }() return outCh } func job2(inCh <-chan int) <-chan int { outCh := make(chan int, 2) go func() { defer close(outCh) for val := range inCh { // 耗时2秒 time.Sleep(time.Second * 2) val++ fmt.Println("job2 finish:", val) outCh <- val } }() return outCh } func job3(inCh <-chan int) <-chan int { outCh := make(chan int, 2) go func() { defer close(outCh) for val := range inCh { val++ fmt.Println("job3 finish:", val) outCh <- val } }() return outCh } func main() { t := time.Now() firstResult := job1(10) secondResult := job2(firstResult) thirdResult := job3(secondResult) for v := range thirdResult { fmt.Println(v) } fmt.Println("all finish") fmt.Println("duration:", time.Since(t).String()) }
输出结果为
job1 finish: 1 job1 finish: 1 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job1 finish: 1 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job1 finish: 1 job2 finish: 2 job3 finish: 3 3 job2 finish: 2 job3 finish: 3 3 job2 finish: 2 job3 finish: 3 3 job2 finish: 2 job3 finish: 3 3 all finish duration: 21s
共计计算21秒。主要是因为job2中的耗时太久导致,现在我们的主要任务就是解决掉这个问题了。
这里只用了一个job2来处理job1的结果,如果我们能多开启几个goroutine job2并行处理会不会提升性能呢?