Go
语言中,通常使用 channel
控制 goroutine
的数量,这里引入 sync.WaitGroup
是为了协程同步。
package main
import (
"log"
"net/http"
"runtime"
"sync"
"time"
_ "net/http/pprof"
)
func main() {
concurrent := 5 // 控制 channel 缓存区的长度
w := sync.WaitGroup{}
ch := make(chan bool, concurrent)
i := 0
for {
i++
ch <- true
w.Add(1)
go func(i int) {
defer w.Done()
log.Println(http.ListenAndServe("localhost:6060", nil))
time.Sleep(time.Millisecond)
log.Println("Goroutine", runtime.NumGoroutine()) // 最大值为 9
log.Println(i)
<-ch
}(i)
}
w.Wait()
}
执行程序,打开浏览器,键入:
127.0.0.1:6060/debug/pprof/goroutine
下载 goroutine
文件至本地,cd
至 goroutine
文件同目录下,在终端键入:
go tool pprof -http=":8081" goroutine
会自动打开浏览器页面,可以清晰的看到 goroutine
的数量以及调用关系。
左侧的菜单栏,可以查看Top、Graph、Flame Graph
等。