go语言协程>
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1. 通过channel实现 (生产者-消费者模式)
-
一个协程发送0-9数字
-
一个协程计算数字的平方
-
主协程输出结果
package main func main() { src := make(chan int) dest := make(chan int, 3) go func() { defer close(src) for i := 0; i<10; i++ { src <- i } }() go func () { defer close(dest) for i := range src { dest <- i * i } }() for i := range dest { println(i) } }生产者生产的速度较快,可以给dest管道增加缓冲区,平衡生活者消费者的速度。
程序输出结果
(base) ubuntu@VM-8-5-ubuntu:~/workspace/go/src/go_learn/01$ go run "/home/ubuntu/workspace/go/src/go_learn/01/main.go" 0 1 4 9 16 25 36 49 64 81
2. WaitGroup 使用
-
开启一个协程 +1
-
协程执行结束 -1
-
主协程阻塞直到计数器为 0
package main import ( "fmt" "sync" ) func PrintInfo(i int) { fmt.Println("子协程打印的数字是: ", i) } func main() { var wg sync.WaitGroup wg.Add(5) for i := 0; i < 5; i++ { go func(i int) { defer wg.Done() PrintInfo(i) }(i) } wg.Wait() fmt.Println("子协程已经全部结束! 主协程即将退出") }
上面程序输出结果:
(base) ubuntu@VM-8-5-ubuntu:~/workspace/go/src/go_learn/02$ go run "/home/ubuntu/workspace/go/src/go_learn/02/main.go"
子协程打印的数字是: 4
子协程打印的数字是: 0
子协程打印的数字是: 1
子协程打印的数字是: 2
子协程打印的数字是: 3
子协程已经全部结束! 主协程即将退出
可以看出,虽然子协程的执行顺序是乱序的,但主能在所有子协程都执行完毕后再退出。