Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mengkonfigurasi had goroutine dengan betul?
editor php Yuzai akan memperkenalkan anda cara mengkonfigurasi sekatan goroutine dengan betul. Dalam bahasa Go, goroutine ialah utas ringan yang boleh melaksanakan tugas secara serentak. Walau bagaimanapun, jika tidak terhad, terlalu banyak gorout boleh menyebabkan keletihan sumber atau ranap program. Oleh itu, adalah sangat penting untuk mengkonfigurasi had goroutine dengan betul. Seterusnya, kami akan meneroka beberapa kaedah konfigurasi biasa untuk memastikan program anda boleh berjalan dengan stabil dan menggunakan sepenuhnya sumber sistem.
Saya mempunyai tugas untuk melaksanakan tiga fungsi jika tiga fungsi dipilih untuk berfungsi. Saya mahu mengehadkan bilangan horoutine setiap fungsi. Sebagai contoh, setiap goroutine hanya boleh menjalankan maksimum 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") }
Saya tahu anda boleh mengehadkan bilangan goroutine kepada kumpulan pekerja. Walau bagaimanapun, jika saya mencipta kumpulan pekerja terhad kepada 10 goroutin, nombor itu dibahagikan dengan 3 tugasan dan saya memerlukan 10 goroutine setiap fungsi.
Saya boleh mencipta 3 kumpulan, tetapi itu nampaknya bukan pendekatan yang sesuai untuk saya.
Saya mahu menggunakan perpustakaan ini untuk mencipta kumpulan pekerja: https://github.com/sourcegraph/conc
Berikut ialah kaedah: gunakan saluran penimbal untuk setiap pilihan supaya anda boleh mengehadkan gorouti yang aktif :
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() }
Atas ialah kandungan terperinci Bagaimana untuk mengkonfigurasi had goroutine dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!