使用 channel 进行并发控制
示例代码如下
package main
import (
"time"
"fmt"
)
func Process(ch chan int) {
// 任务处理 - 耗时
time.Sleep(time.Second)
ch <- 1 //向【结束管道】中写入一个元素表示当前协程已结束
}
func main() {
// 注意长度要和启动的 goroutine 个数一样,否则达不到控制的目的
channels := make([]chan int, 10) //创建一个10个元素的切片,元素类型为channel
// 启动的 goroutine 个数要和上面 channel 的长度一致,否则无法控制
for i:= 0; i < 10; i++ {
channels[i] = make(chan int) //切片中放入一个channel
go Process(channels[i]) //启动协程,传一个管道用于通信
}
for i, ch := range channels { //遍历切片,channel没有数据的时候,会阻塞住,并等待子协程结束
<-ch
fmt.Println("Routine ", i, " quit!")
}
}
在父协程反向通知子协程的时候就比较麻烦了,要定期检查退出协程是否有信号