这个goroutine泄露的demo如何修复?

xxxo · · 875 次点击
读取ch的放在循环里面,读取3次。 func queryAll() int { count := 3 ch := make(chan int, count) for i := 0; i < count; i++ { go func() { ch <- query() }() } sum := 0 for i := 0; i < count; i++ { sum += <-ch } return sum }
#2
更多评论
```go go func() { ch <- query() }() ``` 这里你使用的无缓冲的 channel 会阻塞造成 goroutine 无法退出,可以修改 `ch` 的容量为 3,也可以添加超时控制。 另外使用 `rand.Intn()` 的时候要添加种子。 最后,使用 prrof 去找更方便: ```go import ( "fmt" "math/rand" "net/http" "time" _ "net/http/pprof" ) func init() { rand.Seed(time.Now().UnixNano()) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } func handler(rep http.ResponseWriter, req *http.Request) { var a int for i := 0; i < 4; i++ { a += queryAll() } rep.Write([]byte(fmt.Sprintf("%d", a))) } ... ... ``` 这样请求 `http://127.0.0.1:8080/debug/pprof/goroutine?debug=1` 可以直观的看到 goroutine 在哪里泄漏的。 ![image.png](https://static.studygolang.com/211230/9357f972bb3b247fc16befa293fb5974.png)
#1
这是我想要的答案,感谢。 有一个疑问 total 36是总的goroutine数量, 第一行的32代表泄露32个吗?
#3