github.com/onedss/naza@v0.20.2/pkg/taskpool/taskpool_test.go (about) 1 // Copyright 2019, Chef. All rights reserved. 2 // https://github.com/onedss/naza 3 // 4 // Use of this source code is governed by a MIT-style license 5 // that can be found in the License file. 6 // 7 // Author: Chef (191201771@qq.com) 8 9 package taskpool_test 10 11 import ( 12 "sync" 13 "sync/atomic" 14 "testing" 15 "time" 16 17 "github.com/onedss/naza/pkg/taskpool" 18 19 "github.com/onedss/naza/pkg/assert" 20 "github.com/onedss/naza/pkg/nazalog" 21 ) 22 23 var ( 24 taskNum = 1000 * 1000 25 initWorkerNum = 1 //1000 * 20 //1000 * 10 26 ) 27 28 func BenchmarkOriginGo(b *testing.B) { 29 nazalog.Debug("> BenchmarkOriginGo") 30 var wg sync.WaitGroup 31 for j := 0; j < 1; j++ { 32 wg.Add(taskNum) 33 for i := 0; i < taskNum; i++ { 34 go func() { 35 time.Sleep(10 * time.Millisecond) 36 wg.Done() 37 }() 38 } 39 wg.Wait() 40 } 41 nazalog.Debug("< BenchmarkOriginGo") 42 } 43 44 func BenchmarkTaskPool(b *testing.B) { 45 nazalog.Debug("> BenchmarkTaskPool") 46 var wg sync.WaitGroup 47 p, _ := taskpool.NewPool(func(option *taskpool.Option) { 48 option.InitWorkerNum = initWorkerNum 49 }) 50 51 b.ResetTimer() 52 for j := 0; j < 1; j++ { 53 //b.StartTimer() 54 wg.Add(taskNum) 55 for i := 0; i < taskNum; i++ { 56 p.Go(func(param ...interface{}) { 57 time.Sleep(10 * time.Millisecond) 58 wg.Done() 59 }) 60 } 61 wg.Wait() 62 } 63 nazalog.Debug("< BenchmarkTaskPool") 64 } 65 66 func TestTaskPool(t *testing.T) { 67 var wg sync.WaitGroup 68 p, _ := taskpool.NewPool(func(option *taskpool.Option) { 69 option.InitWorkerNum = 1 70 }) 71 72 go func() { 73 //for { 74 nazalog.Debugf("timer, worker num. status=%+v", p.GetCurrentStatus()) 75 time.Sleep(10 * time.Millisecond) 76 //} 77 }() 78 79 n := 1000 80 wg.Add(n) 81 nazalog.Debug("start.") 82 for i := 0; i < n; i++ { 83 p.Go(func(param ...interface{}) { 84 time.Sleep(10 * time.Millisecond) 85 wg.Done() 86 }) 87 } 88 wg.Wait() 89 nazalog.Debugf("done, worker num. status=%+v", p.GetCurrentStatus()) // 此时还有个别busy也是正常的,因为只是业务方的任务代码执行完了,可能还没回收到idle队列中 90 p.KillIdleWorkers() 91 nazalog.Debugf("killed, worker num. status=%+v", p.GetCurrentStatus()) 92 93 time.Sleep(100 * time.Millisecond) 94 95 wg.Add(n) 96 for i := 0; i < n; i++ { 97 p.Go(func(param ...interface{}) { 98 time.Sleep(10 * time.Millisecond) 99 wg.Done() 100 }) 101 } 102 wg.Wait() 103 nazalog.Debugf("done, worker num. status=%+v", p.GetCurrentStatus()) 104 } 105 106 func TestMaxWorker(t *testing.T) { 107 p, err := taskpool.NewPool(func(option *taskpool.Option) { 108 option.MaxWorkerNum = 128 109 }) 110 assert.Equal(t, nil, err) 111 112 go func() { 113 for i := 0; i < 5; i++ { 114 nazalog.Debugf("timer. status=%+v", p.GetCurrentStatus()) 115 time.Sleep(100 * time.Millisecond) 116 } 117 }() 118 119 var wg sync.WaitGroup 120 var sum int32 121 n := 1000 122 wg.Add(n) 123 nazalog.Debugf("start.") 124 for i := 0; i < n; i++ { 125 p.Go(func(param ...interface{}) { 126 a := param[0].(int) 127 b := param[1].(int) 128 atomic.AddInt32(&sum, int32(a)) 129 atomic.AddInt32(&sum, int32(b)) 130 time.Sleep(10 * time.Millisecond) 131 wg.Done() 132 }, i, i) 133 } 134 wg.Wait() 135 nazalog.Debugf("end. sum=%d", sum) 136 } 137 138 func TestGlobal(t *testing.T) { 139 err := taskpool.Init() 140 assert.Equal(t, nil, err) 141 s := taskpool.GetCurrentStatus() 142 assert.Equal(t, 0, s.TotalWorkerNum) 143 assert.Equal(t, 0, s.IdleWorkerNum) 144 assert.Equal(t, 0, s.BlockTaskNum) 145 taskpool.Go(func(param ...interface{}) { 146 }) 147 taskpool.KillIdleWorkers() 148 } 149 150 func TestCorner(t *testing.T) { 151 _, err := taskpool.NewPool(func(option *taskpool.Option) { 152 option.InitWorkerNum = -1 153 }) 154 assert.Equal(t, taskpool.ErrTaskPool, err) 155 156 _, err = taskpool.NewPool(func(option *taskpool.Option) { 157 option.MaxWorkerNum = -1 158 }) 159 assert.Equal(t, taskpool.ErrTaskPool, err) 160 161 _, err = taskpool.NewPool(func(option *taskpool.Option) { 162 option.InitWorkerNum = 5 163 option.MaxWorkerNum = 1 164 }) 165 assert.Equal(t, taskpool.ErrTaskPool, err) 166 }