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 }
Walau bagaimanapun, tiada cara untuk mencetak nombor aktif semasa goroutine.
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 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(&wg, queue) } wg.Wait() close(queue) fmt.Println("list len", len(queue)) //this must be 0 }
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!