Go语言协程并发---管道信号量应用

Posted xiaoqiang1_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
	}
}

 

以上是关于Go语言协程并发---管道信号量应用的主要内容,如果未能解决你的问题,请参考以下文章

Go中多协程协作之sync.Cond

七天入门Go语言 通道 & Goroutine | 第四天 并发编程

Go语言之gorountine与管道初体验

2021-GO语言并发编程

2021-GO语言并发编程

go语言并发同步 select