一、并发控制
1、协程 A 在执行过程中需要创建子协程 A1 、A2 .... An ,协程A创建完子协程后就等待子协程退出。针对这种场景,go 提供了 3 种解决方案。
1) Channel:使用 channel 控制子协程。2) WaitGroup: 使用信号量机制控制子协程。3)Context : 使用上下文控制子协程。
1.1 channel
package main
import (
"time"
"fmt"
)
func Process (ch chan int) {
// do some work
time.Sleep(tiem.Second)
ch <- 1 // 在管道中写入一个元素表示当前协程已结束
}
func main() {
channels := make([] chan int, 10)
for i := 0; i < 10; 1++ {
channels[i] = make(chan int) // 在切片中放入一个 channel
go Process(channels[i]) // 启动协程,传入一个管道用于通信
}
for i, ch := range channels { // 遍历切片等待子协程结束
<- ch
fmt .Println("Routine ", i, " quit!")
}
}
1.2 WaitGroup
1) Add() 操作必须早于 Wait(), 否则会触发 panic 。2)Add() 设置的值必须与实际等待的 goroutine 的个数一致,否则会触发 panic。