goutil
goutil copied to clipboard
workshop如何限制资源的?
@henrylee2cn 1.这里workshop相当于在100万个协程中分别执行,和不使用workshop有啥区别? worker并不是在一个协程执行的啊? https://github.com/henrylee2cn/goutil/blob/5b5425bff75ce88e91a6122e91fb7f0d751b8d16/pool/workshop_test.go#L73-L83
2.workshop和直接使用协程对比
=== RUN TestGoChan
--- PASS: TestGoChan (0.30s)
workshop_test.go:35: pool_size:50, requests:100000, one_logic_cost:10ms, total_cost:295ms, QPS:338983
=== RUN TestChanPool
--- PASS: TestChanPool (20.04s)
workshop_test.go:35: pool_size:50, requests:100000, one_logic_cost:10ms, total_cost:20.043s, QPS:4989
=== RUN TestWorkshop
--- PASS: TestWorkshop (0.39s)
workshop_test.go:100: workshop stats: {Worker:50 Idle:50 Created:50 Doing:0 Done:100000 MaxLoad:0 MinLoad:0}
workshop_test.go:35: pool_size:50, requests:100000, one_logic_cost:10ms, total_cost:394ms, QPS:253807
goos: windows
goarch: amd64
pkg: workshop
其中第一个是仅使用100万go 协程,代码如下:
`
wg := new(sync.WaitGroup)
wg.Add(requests)
startNano := time.Now().UnixNano()
for i := 0; i < requests; i++ {
go func() {
defer wg.Done()
worker := &testWorker{}
worker.Do()
}()
}
wg.Wait()
reportStat(t, startNano)`
@Linnkenn 你这个相当于不限制最大使用线程数,你可以使用APIfmt.Println("最大使用资源数: ", runtime.NumGoroutine())
来查看具体情况
你这个TestGoChan
同时运行了上千个Goroutine
。
但是如果你使用一个chan 来限制并发数时 代码如下需要定义一个新的函数
func (t *testWorker) Do2(s *chan int) {
time.Sleep(oneLogicCostTime)
<-*s
}
wg := new(sync.WaitGroup)
wg.Add(requests)
maxchan := make(chan int, poolSize)
for i := 0; i < requests; i++ {
maxchan <- 1
go func() {
defer wg.Done()
worker := &testWorker{}
worker.Do2(&maxchan)
}()
fmt.Println("最大使用资源数", runtime.NumGoroutine())
}
wg.Wait()
这时候你发现你的测试程序QPS和TestChanPool
类似。
WorkShop在限制最大协程数50的情况下,保证了高QPS,其实还是挺神奇的。