为了账号安全,请及时绑定邮箱和手机立即绑定

计数/显示活动 goroutine 的数量

计数/显示活动 goroutine 的数量

Go
噜噜哒 2021-08-16 20:07:15
我有一个队列和一个既可以出队又可以入队的函数。我想确保正确数量的 goroutines 在队列上运行,只要列表中有东西。这是我正在使用的代码,但我想知道是否有办法打印当前活动的 goroutines 的数量我正在从 localhost 读取 json 文档并尝试将其转换为Test类型:type Test struct {    one string    two string    three string}res, err := http.Get("http://localhost/d/")perror(err)defer res.Body.Close()body, err := ioutil.ReadAll(res.Body)perror(err)var data Testerr = json.Unmarshal(body, &data)if err != nil {    fmt.Printf("%T\n%s\n%#v\n",err, err, err)    switch v := err.(type){    case *json.SyntaxError:        fmt.Println(string(body[v.Offset - 40:v.Offset]))    }}fmt.Println("response:")fmt.Println(string(body))fmt.Println("type:")fmt.Println(data)但输出显示一个空对象:response:{    "one" : "one thing",    "two" : "two things",    "three" : "3 things"}type:{  }我究竟做错了什么?
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

有,runtime.NumGoroutine但你接近这个错误。


您的循环将不断产生 goroutine。

由于 for 循环,这将不必要地消耗 CPU 周期。

一种方法是使用sync.WaitGroup。


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


}

playground


--- 带有比赛的旧越野车版本---


func deen(wg *sync.WaitGroup, queue chan int) {

    for element := range queue {

        wg.Done()

        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)

        }

    }

}


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 is has len", len(queue)) //this must be 0

}


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信