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  }