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 }