首頁 > 後端開發 > Golang > 主體

如何正確配置goroutine限制?

WBOY
發布: 2024-02-13 15:39:08
轉載
598 人瀏覽過

如何正確配置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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!