Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengira dan Mengurus Goroutine Aktif dalam Go dengan Cekap?

Bagaimanakah Saya Boleh Mengira dan Mengurus Goroutine Aktif dalam Go dengan Cekap?

Patricia Arquette
Lepaskan: 2024-12-10 07:09:13
asal
908 orang telah melayarinya

How Can I Efficiently Count and Manage Active Goroutines in Go?

Mengira Goroutine Aktif

Apabila menguruskan berbilang goroutin secara serentak, selalunya perlu memantau bilangan yang aktif. Dalam Go, fungsi runtime.NumGoroutine() asli menyediakan maklumat ini.

Pertimbangkan contoh berikut:

var element int

func deen(queue chan int) {

    element := <-queue
    fmt.Println("element is ", element)
    if element%2 == 0 {
        fmt.Println("new element is ", element)
        queue <- (element*100 + 11)
        queue <- (element*100 + 33)
    }
}

func main() {
    queue := make(chan int, 10)
    queue <- 1
    queue <- 2
    queue <- 3
    queue <- 0
    for len(queue) != 0 {
        for i := 0; i < 2; i++ {
            go deen(queue)
        }
    }
    fmt.Scanln()
    fmt.Println("list has len", len(queue)) //this must be 0
}
Salin selepas log masuk

Walaupun kod ini menunjukkan penggunaan goroutine, ia tidak memberikan cara untuk mengira bilangan goroutin aktif pada bila-bila masa.

Untuk menangani perkara ini, pendekatan yang lebih cekap ialah menggunakan sync.WaitGroup, yang menyelaraskan penyiapan berbilang gorouti.

func deen(wg *sync.WaitGroup, queue chan int) {
    for element := range queue {
        fmt.Println("element is ", element)
        if element%2 == 0 {
            fmt.Println("new element is ", element)
            wg.Add(2)
            queue <- (element*100 + 11)
            queue <- (element*100 + 33)
        }
        wg.Done()
    }
}

func main() {
    var wg sync.WaitGroup
    queue := make(chan int, 10)
    queue <- 1
    queue <- 2
    queue <- 3
    queue <- 0
    for i := 0; i < 4; i++ {
        wg.Add(1)
        go deen(&wg, queue)
    }
    wg.Wait()
    close(queue)
    fmt.Println("list has len", len(queue)) //this must be 0

}
Salin selepas log masuk

Dalam kod yang diubah suai ini, sync.WaitGroup digunakan untuk menjejak bilangan gorouti yang aktif. Setiap goroutine mengurangkan pembilang setelah selesai, dan goroutine utama menunggu sehingga semua goroutine selesai dilaksanakan sebelum meneruskan.

Dengan memanfaatkan masa jalan.NumGoroutine() atau penyegerakan yang lebih cekap.WaitGroup, pengaturcara Go boleh memantau dan mengurus dengan berkesan goroutine aktif dalam aplikasinya.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengira dan Mengurus Goroutine Aktif dalam Go dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan