Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengkonfigurasi had goroutine dengan betul?

Bagaimana untuk mengkonfigurasi had goroutine dengan betul?

WBOY
WBOYke hadapan
2024-02-13 15:39:08574semak imbas

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.

Kandungan soalan

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

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam