登录
首页 >  Golang >  Go问答

限制并发goroutine拾取任务的数量

来源:stackoverflow

时间:2024-02-10 15:45:12 221浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《限制并发goroutine拾取任务的数量》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我正在运行一个循环 - 24 次,它调用一个下游,该下游无法处理由生成的 go 例程同时提供的所有工作,我想限制它,以便只有特定数量(3 或 4)的go-routine 被执行。 示例代码如下所示,如果有人可以向我指出正确的模式来实现这一点,那将是一个很大的帮助

for i:=0; i<24; i++ {
   go callSomeDownStream()
}

正确答案


可以使用空结构体的通道来控制并发worker goroutine的数量

const max_concurrent_jobs = 3

func main() {
    waitchan := make(chan struct{}, max_concurrent_jobs)

    for i:=0; i < 24; i++ {
        waitchan <- struct{}{}
        go func() {
            callsomedownstream()
            <-waitchan
        }()
    }
}
func callSomeDownStream(wg *sync.WaitGroup, queue chan struct{}) {
    defer func() {
        <-queue
        wg.Done()
    }()
    // do something
}

func main() {
    wg := sync.WaitGroup{}
    queue := make(chan struct{}, 3)
    for i := 0; i < 24; i++ {
        queue <- struct{}{}
        wg.Add(1)
        go callSomeDownStream(&wg, queue)
    }
    wg.Wait()
    close(queue)
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《限制并发goroutine拾取任务的数量》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>