画江湖之 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个的打印

画江湖之go学习篇

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 4

channel是阻塞的 你这里是同时起100个goroutings, 并不是 同时只能处理5个并发. 这里起channel毫无意义

select {
case i := <-chan
}
5年前 评论

@motecshine 不太明白你的意思啊 这边为什么要声明管道 是为了控制每一次只处理5个处理脚本而已

5年前 评论

管道怎么控制并发数呢?

5年前 评论
passenger 4年前

提个不成熟的小建议,能把这篇文章,转移到 Go 社区下吗?现在在 Laravel 社区下。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!