Open Linnkenn opened 5 years ago
@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,其实还是挺神奇的。
@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)