本文展示一下如何控制Golang的协程进行顺序执行或者交替执行
1.顺序执行
1package main2
3import (4 "fmt"5 "sync"6)7
8func main() {9 fmt.Println("=====通过 channel 顺序打印=====")10 printOrderlyByChannel()11 fmt.Println("=====通过 WaitGroup 顺序打印=====")12 printOrderlyByWaitGroup()13}14
15// 协程顺序打印 A B C50 collapsed lines
16func printOrderlyByChannel() {17 wg := &sync.WaitGroup{}18 wg.Add(3)19 ch := make(chan string)20 ch2 := make(chan string)21 go func () {22 defer wg.Done()23 fmt.Println("A")24 ch <- "B"25 }()26
27 go func () {28 defer wg.Done()29 fmt.Println(<- ch)30 ch2 <- "C"31 }()32
33 go func () {34 defer wg.Done()35 fmt.Println(<- ch2)36 }()37
38 wg.Wait()39}40
41func printOrderlyByWaitGroup() {42 wg := &sync.WaitGroup{}43
44 wg.Add(1)45 go func () {46 fmt.Println("A")47 wg.Done()48 }()49
50 wg.Wait()51 wg.Add(1)52 go func () {53 fmt.Println("B")54 wg.Done()55 }()56
57 wg.Wait()58 wg.Add(1)59 go func () {60 fmt.Println("C")61 wg.Done()62 }()63
64 wg.Wait()65}
2.交替执行
使用两个channel
1func main() {2 wg := &sync.WaitGroup{}3 wg.Add(2)4 chA := make(chan int, 1)5 chB := make(chan int)6
7 chA <- 18
9 go func() {10 defer wg.Done()11 for i := 0; i < 3; i++ {12 <-chA13 fmt.Println(string(rune('a' + i)))14 chB <- 115 }16 collapsed lines
16 }()17
18 go func() {19 defer wg.Done()20 for i := 0; i < 3; i++ {21 <-chB22 fmt.Println(i + 1)23 if i == 2 {24 break25 }26 chA <- 127 }28 }()29
30 wg.Wait()31}