首頁 > 後端開發 > Golang > 如何準確統計並發Go程式中活躍的goroutines?

如何準確統計並發Go程式中活躍的goroutines?

Linda Hamilton
發布: 2024-12-07 15:16:14
原創
532 人瀏覽過

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

如何統計並顯示活躍Goroutines 的數量

在你的程式中,你想同時監控當前Goroutines 的數量使隊列出隊和入隊。當您提供了用於管理佇列的程式碼時,您已經查詢了一種檢索目前活動 Goroutines 數量的方法。

  • Runtime.NumGoroutine:
    runtime .NumGoroutine 提供了一種方法來擷取 Go 程式中目前活動 goroutine 的數量。然而,嘗試在當前的實作中使用這種方法可能會導致不正確的結果,因為你的 goroutine 生成器循環將不斷創建新的 goroutine。
  • 使用 WaitGroup:
    更合適的解決方案包括使用sync.WaitGroup。 WaitGroup 允許多個 goroutine 的等待和同步。初始化一個 WaitGroup 並將其傳遞給您的 goroutine 函數。每個開始工作的 goroutine 都應該呼叫 wg.Add(1),完成後,應該呼叫 wg.Done() 來減少計數。然後,Main() 函數可以呼叫 wg.Wait() 來等待所有 goroutine 完成。

這是使用 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
}
登入後複製

以上是如何準確統計並發Go程式中活躍的goroutines?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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