首頁 >後端開發 >Golang >如何正確配置goroutine限制?

如何正確配置goroutine限制?

WBOY
WBOY轉載
2024-02-13 15:39:08646瀏覽

如何正確配置goroutine限制?

php小編魚仔將為您介紹如何正確配置goroutine限制。在Go語言中,goroutine是一種輕量級的線程,可以並發執行任務。然而,如果不進行限制,過多的goroutine可能會導致資源耗盡或程式崩潰。因此,正確配置goroutine限制是非常重要的。接下來,我們將探討一些常見的設定方法,以確保您的程式能夠穩定運作並充分利用系統資源。

問題內容

我有一個任務,如果選擇三個功能來工作,則執行三個功能。我想限制每個函數的 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限制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除