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)
	}
}

猜你喜欢

转载自www.cnblogs.com/yunweiqiang/p/12769679.html