以协程交替打印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()
}