goutil icon indicating copy to clipboard operation
goutil copied to clipboard

workshop如何限制资源的?

Open Linnkenn opened this issue 5 years ago • 1 comments

@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 avatar Jun 04 '19 06:06 Linnkenn

@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,其实还是挺神奇的。

dashjay avatar Feb 05 '20 08:02 dashjay