标签:名称 信号量控制 ++ 注销 UNC 任务 func ack --
package main
import (
"fmt"
"math"
"strconv"
"time"
)
/*
·100条协程并发求1-10000平方根
·最大并发数控制在5
·管道实现
*/
func GetSqrt(name string, n int, chSem chan string) {
//想执行,先注册
//能写入就执行,写不进去就阻塞到能写入为止
chSem <- name
ret := math.Sqrt(float64(n))
time.Sleep(time.Second)
fmt.Printf("%d的平方根是%.2f\n",n , ret)
//任务执行完毕,从信号量控制管道注销自己,以便为其他协程腾出空间
<- chSem
}
func main() {
/*
并发数(信号量)控制管道
凡要并发执行的协程必须先将协程名称注册到该管道
*/
chSem := make(chan string, 5)
for i := 0; i < 100; i++ {
go GetSqrt("协程"+strconv.Itoa(i), i, chSem)
}
for true {
time.Sleep(time.Second)
}
}
标签:名称 信号量控制 ++ 注销 UNC 任务 func ack --
原文地址:https://www.cnblogs.com/yunweiqiang/p/12769679.html