go语言协程 | 青训营笔记

75 阅读1分钟

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
子协程已经全部结束! 主协程即将退出

可以看出,虽然子协程的执行顺序是乱序的,但主能在所有子协程都执行完毕后再退出。

我的博客地址