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中文網其他相關文章!