Go语言协程并发---管道信号量应用
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) } }