画江湖之 Go 学习篇 [信号量]
krisji 记录自己学习go的知识点以及工作上的实战,各位小伙伴们赶紧上车咯~
## go如何通过信号量控制并发量?
看代码
package main
import (
"fmt"
"math"
"sync"
"time"
)
var wg08 sync.WaitGroup
var chSem chan int
func main() {
//通过管道定义信号量5个 意思代表只能有五个同时并发
chSem = make(chan int, 5)
//起100个任务并发处理
for i := 0; i < 100; i++ {
wg08.Add(1)//等待组
go getSqrt(i)//开辟协程处理
}
wg08.Wait()//等待组阻塞主协程
}
func getSqrt(n int) {
//规定:所有并发任务都必须注册在信号量管道里
chSem <- n
fmt.Printf("%d的平方根是%.2f\n", n, math.Sqrt(float64(n)))
<- time.After(10 * time.Second)//定时器
//任务结束后从信号量管道注销,给其它腾出空间
<-chSem
wg08.Done()
}
看下输出内容 5个 5个的打印

本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
channel是阻塞的 你这里是同时起100个goroutings, 并不是 同时只能处理5个并发. 这里起channel毫无意义
@motecshine 不太明白你的意思啊 这边为什么要声明管道 是为了控制每一次只处理5个处理脚本而已
管道怎么控制并发数呢?
提个不成熟的小建议,能把这篇文章,转移到 Go 社区下吗?现在在 Laravel 社区下。