协程顺序打印和交替打印
本文展示一下如何控制Golang的协程进行顺序执行或者交替执行
1.顺序执行
package main
import (
"fmt"
"sync"
)
func main() {
fmt.Println("=====通过 channel 顺序打印=====")
printOrderlyByChannel()
fmt.Println("=====通过 WaitGroup 顺序打印=====")
printOrderlyByWaitGroup()
}
// 协程顺序打印 A B C
func printOrderlyByChannel() {
wg := &sync.WaitGroup{}
wg.Add(3)
ch := make(chan string)
ch2 := make(chan string)
go func () {
defer wg.Done()
fmt.Println("A")
ch <- "B"
}()
go func () {
defer wg.Done()
fmt.Println(<- ch)
ch2 <- "C"
}()
go func () {
defer wg.Done()
fmt.Println(<- ch2)
}()
wg.Wait()
}
func printOrderlyByWaitGroup() {
wg := &sync.WaitGroup{}
wg.Add(1)
go func () {
fmt.Println("A")
wg.Done()
}()
wg.Wait()
wg.Add(1)
go func () {
fmt.Println("B")
wg.Done()
}()
wg.Wait()
wg.Add(1)
go func () {
fmt.Println("C")
wg.Done()
}()
wg.Wait()
}
2.交替执行
使用两个channel
func main() {
wg := &sync.WaitGroup{}
wg.Add(2)
chA := make(chan int, 1)
chB := make(chan int)
chA <- 1
go func() {
defer wg.Done()
for i := 0; i < 3; i++ {
<-chA
fmt.Println(string(rune('a' + i)))
chB <- 1
}
}()
go func() {
defer wg.Done()
for i := 0; i < 3; i++ {
<-chB
fmt.Println(i + 1)
if i == 2 {
break
}
chA <- 1
}
}()
wg.Wait()
}