CodeArena

协程顺序打印和交替打印

2023-09-13
Golang
最后更新:2024-05-23
2分钟
235字

本文展示一下如何控制Golang的协程进行顺序执行或者交替执行

1.顺序执行

1
package main
2
3
import (
4
"fmt"
5
"sync"
6
)
7
8
func main() {
9
fmt.Println("=====通过 channel 顺序打印=====")
10
printOrderlyByChannel()
11
fmt.Println("=====通过 WaitGroup 顺序打印=====")
12
printOrderlyByWaitGroup()
13
}
14
15
// 协程顺序打印 A B C
50 collapsed lines
16
func 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
41
func 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

1
func main() {
2
wg := &sync.WaitGroup{}
3
wg.Add(2)
4
chA := make(chan int, 1)
5
chB := make(chan int)
6
7
chA <- 1
8
9
go func() {
10
defer wg.Done()
11
for i := 0; i < 3; i++ {
12
<-chA
13
fmt.Println(string(rune('a' + i)))
14
chB <- 1
15
}
16 collapsed lines
16
}()
17
18
go func() {
19
defer wg.Done()
20
for i := 0; i < 3; i++ {
21
<-chB
22
fmt.Println(i + 1)
23
if i == 2 {
24
break
25
}
26
chA <- 1
27
}
28
}()
29
30
wg.Wait()
31
}
本文标题:协程顺序打印和交替打印
文章作者:Echoidf
发布时间:2023-09-13
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode