Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengira Goroutine Aktif dengan Tepat dalam Program Go Serentak?

Bagaimana Mengira Goroutine Aktif dengan Tepat dalam Program Go Serentak?

Linda Hamilton
Lepaskan: 2024-12-07 15:16:14
asal
574 orang telah melayarinya

How to Accurately Count Active Goroutines in a Concurrent Go Program?

Cara Mengira dan Memaparkan Bilangan Goroutine Aktif

Dalam program anda, anda ingin memantau kiraan goroutin yang sedang aktif sambil serentak dequeuing dan enqueueing a queue. Semasa anda memberikan kod untuk mengurus baris gilir anda, anda telah bertanya tentang kaedah untuk mendapatkan semula bilangan goroutin aktif semasa.

  • Runtime.NumGoroutine:
    masa jalan .NumGoroutine menyediakan cara untuk mendapatkan semula kiraan semasa goroutin aktif dalam program Go anda. Walau bagaimanapun, cubaan menggunakan pendekatan ini dalam pelaksanaan semasa anda mungkin membawa kepada keputusan yang salah kerana gelung pemijah goroutine anda akan terus mencipta goroutin baharu.
  • Menggunakan WaitGroup:
    Penyelesaian yang lebih sesuai melibatkan menggunakan penyegerakan.WaitGroup. WaitGroup membenarkan penantian dan penyegerakan berbilang goroutine. Mulakan WaitGroup dan hantar ke fungsi goroutine anda. Setiap goroutine yang memulakan kerja harus memanggil wg.Add(1), dan setelah selesai, wg.Done() harus dipanggil untuk mengurangkan kiraan. Fungsi Main() kemudiannya boleh memanggil wg.Wait() untuk menunggu semua goroutine selesai.

Berikut ialah versi semakan kod anda menggunakan WaitGroup:

import (
    "fmt"
    "sync"
)

var element int

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

func main() {
    var wg sync.WaitGroup
    queue := make(chan int, 10)
    queue <- 1
    queue <- 2
    queue <- 3
    queue <- 0

    fmt.Println("initial active goroutines:", runtime.NumGoroutine())

    for i := 0; i < 4; i++ {
        wg.Add(1) // Increment WaitGroup count for each spawned goroutine
        go deen(&wg, queue)
    }

    wg.Wait() // Wait for all goroutines to complete
    close(queue)
    fmt.Println("final active goroutines:", runtime.NumGoroutine())
    fmt.Println("list length:", len(queue)) // Expect 0
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana Mengira Goroutine Aktif dengan Tepat dalam Program Go Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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