以协程交替打印0-100理解协程间如何通信
golang中开启协程
在golang中用go关键值修饰函数调用,将开启协程执行函数。
1
2
3
4
5
6
7
8
9
|
package main
import "fmt"
func main() {
go func() {
fmt.Println("go1")
}()
}
|
两个协程交替打印0-100
协程间通信使用数据管道chan,协程1和协程2交替往对方监听的chan中发送数据进行打印。
chan3的作用是和主协程间通信,阻塞主协程到打印任务完成。
需要注意的是chan默认缓冲区大小是0,因此发送和获取数据默认是阻塞的。
可以在make(chan int,n)时设置缓冲区大小来解决。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package main
import "fmt"
func print100() {
chan1, chan2, chan3 := make(chan int), make(chan int), make(chan int)
// 开启协程1
go func() {
chan2 <- 0
for num := range chan1 {
if num > 100 {
close(chan2)
close(chan1)
//告诉主线程打印完毕
close(chan3)
break
}
fmt.Println("go1 :", num)
num++
chan2 <- num
}
}()
// 开启协程2
go func() {
for num := range chan2 {
if num > 100 {
close(chan2)
close(chan1)
close(chan3)
break
}
fmt.Println("go2 :", num)
num++
chan1 <- num
}
}()
// 阻塞主协程,等待协程执行打印任务完成
<-chan3
}
func main() {
// 执行交替打印100
print100()
}
|