Bagaimana untuk mengkonfigurasi had goroutine dengan betul?

WBOY
Lepaskan: 2024-02-13 15:39:08
ke hadapan
600 orang telah melayarinya

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")
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mengkonfigurasi had goroutine dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!