Golang的并发控制-channel

使用 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!")
    }
}

在父协程反向通知子协程的时候就比较麻烦了,要定期检查退出协程是否有信号