首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板