Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengira dan Mengurus Goroutine Aktif dengan Tepat dalam Go?

Bagaimana Mengira dan Mengurus Goroutine Aktif dengan Tepat dalam Go?

DDD
Lepaskan: 2024-11-28 18:21:11
asal
999 orang telah melayarinya

How to Accurately Count and Manage Active Goroutines in Go?

Cara Mengira dan Memaparkan Bilangan Goroutine Aktif

Dalam kod ini, kami mempunyai baris gilir dan fungsi deen yang melakukan kedua-dua dequeueing dan enqueueing:

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 is has len", len(queue)) //this must be 0
}
Salin selepas log masuk

Walau bagaimanapun, tiada cara untuk mencetak nombor aktif semasa goroutine.

Menggunakan runtime.NumGoroutine

Walaupun terdapat cara untuk mendapatkan jumlah bilangan goroutine aktif menggunakan runtime.NumGoroutine, ia bukanlah pendekatan terbaik. Ini kerana gelung akan terus menghasilkan goroutine, yang membawa kepada penggunaan CPU yang tidak perlu.

Pendekatan Lebih Baik: Menggunakan Sync.WaitGroup

Pendekatan yang lebih cekap ialah menggunakan penyegerakan.WaitGroup, yang membolehkan kami menjejaki bilangan gorouti yang aktif.

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(&amp;wg, queue)
    }
    wg.Wait()
    close(queue)
    fmt.Println("list len", len(queue)) //this must be 0
}
Salin selepas log masuk

Di sini, kami mulakan dengan empat goroutine dan tunggu sehingga mereka menyelesaikan kerja mereka sebelum menutup baris gilir. Pendekatan ini menyediakan cara yang lebih bersih dan terkawal untuk mengurus bilangan gorouti yang aktif.

Atas ialah kandungan terperinci Bagaimana Mengira dan Mengurus Goroutine Aktif dengan Tepat dalam Go?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan