首頁 > 後端開發 > Golang > Go中如何準確統計和管理活躍的goroutine?

Go中如何準確統計和管理活躍的goroutine?

DDD
發布: 2024-11-28 18:21:11
原創
1001 人瀏覽過

How to Accurately Count and Manage Active Goroutines in Go?

如何計算和顯示活動Goroutines 的數量

在這段程式碼中,我們有一個隊列和一個執行出隊和入隊操作的函數deen:

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
}
登入後複製

但是,沒有辦法列印目前的活躍數量goroutines.

使用runtime.NumGoroutine

雖然有一種方法可以使用runtime.NumGoroutine來取得活動goroutine的總數,但這不是最好的方法。這是因為循環會繼續產生 goroutine,導致不必要的 CPU 消耗。

更好的方法:使用 Sync.WaitGroup

更有效的方法是使用sync.WaitGroup,它讓我們追蹤活躍 goroutine 的數量。

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
}
登入後複製

這裡,我們從四個開始goroutine 並等待它們完成工作後再關閉隊列。這種方法提供了一種更乾淨、更受控的方式來管理活動 goroutine 的數量。

以上是Go中如何準確統計和管理活躍的goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板