码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-04-24 20:16:19      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:名称   信号量控制   ++   注销   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)
	}
}

 

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

标签:名称   信号量控制   ++   注销   UNC   任务   func   ack   --   

原文地址:https://www.cnblogs.com/yunweiqiang/p/12769679.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!