登录
首页 >  Golang >  Go问答

正确设置goroutine并发限制的方法

来源:stackoverflow

时间:2024-02-17 17:42:24 226浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《正确设置goroutine并发限制的方法》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我有一个任务,如果选择三个功能来工作,则执行三个功能。我想限制每个函数的 horoutines 数量。例如,每个 goroutine 最多只能运行 10 个。

func main() {
    checkMethod1 := true
    checkMethod2 := false
    checkMethod3 := true

    list := []string{"info1", "info2", "info3", "info5"}

    for _, value := range list {
        value := value
        if checkMethod1 {
            go func() {
                //use value
                fmt.Println(value)
            }()
        }
        if checkMethod2 {
            go func() {
                //use value
                fmt.Println(value)
            }()
        }
        if checkMethod3 {
            go func() {
                //use value
                fmt.Println(value)
            }()
        }
    }
    //finish
    fmt.Println("All done")
}

我知道你可以将 goroutine 的数量限制为工作池。但是,如果我创建一个限制为 10 个 goroutine 的工作池,则该数字除以 3 个任务,并且我需要每个函数有 10 个 goroutine。

我可以创建 3 个池,但这对我来说似乎不是一个可行的方法。

我想使用这个库来创建工作池:https://github.com/sourcegraph/conc


正确答案


这里有一个方法:为每个选项使用一个缓冲通道,这样你就可以限制活动的 goroutine:

m1:=make(chan struct{},10)
m2:=make(chan struct{},10)
m3:=make(chan struct{},10)
wg:=sync.WaitGroup{}

for _, value := range list {
   value := value
   if checkMethod1 {
       m1<-struct{}{}
       wg.Add(1)
       go func() {
           defer func() { 
              <-m1 
              wg.Done()
           }()
           // do work
       }()
   }
   if checkMethod2 {
       m2<-struct{}{}
       wg.Add(1)
       go func() {
           defer func() { 
               <-m2 
               wg.Done()
           }()
           // do work
       }()
   }
   ...

  wg.Wait()
}

好了,本文到此结束,带大家了解了《正确设置goroutine并发限制的方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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