github.com/Anderson-Lu/gobox@v0.0.0-20191127065433-3e6c4c2da420/concurrent/concurrent_task.go (about)

     1  package concurrent
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  )
     7  
     8  type ConcurrentTaskDetail struct {
     9  	fn     func(...interface{})
    10  	params []interface{}
    11  }
    12  
    13  //并发任务调度器
    14  type ConcurrentTask struct {
    15  	wg    sync.WaitGroup
    16  	tasks []ConcurrentTaskDetail
    17  	max   int
    18  	cost  int64
    19  }
    20  
    21  func NewConcurrentTask(maxConcurentNum int) *ConcurrentTask {
    22  	return &ConcurrentTask{
    23  		wg:    sync.WaitGroup{},
    24  		tasks: make([]ConcurrentTaskDetail, 0),
    25  		max:   maxConcurentNum,
    26  	}
    27  }
    28  
    29  func (self *ConcurrentTask) Cost() int64 {
    30  	return self.cost
    31  }
    32  
    33  func (self *ConcurrentTask) AddTask(task func(...interface{}), params ...interface{}) {
    34  	self.tasks = append(self.tasks, ConcurrentTaskDetail{
    35  		fn:     task,
    36  		params: params,
    37  	})
    38  }
    39  
    40  func (self *ConcurrentTask) Start() {
    41  	curTaskNum := 0
    42  	begin := time.Now().UnixNano() / 1000000
    43  	for _, v := range self.tasks {
    44  		self.wg.Add(1)
    45  		curTaskNum++
    46  		go func(v ConcurrentTaskDetail) {
    47  			defer func() {
    48  				self.wg.Done()
    49  				curTaskNum--
    50  			}()
    51  			v.fn(v.params)
    52  		}(v)
    53  		for {
    54  			if curTaskNum < self.max {
    55  				break
    56  			}
    57  			time.Sleep(time.Millisecond * 100)
    58  		}
    59  	}
    60  	self.wg.Wait()
    61  	self.cost = time.Now().UnixNano()/1000000 - begin
    62  }