1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package sequencetask
- import (
- "leafstalk/log"
- "sync"
- )
- const (
- defaultFunLen = 1000
- )
- type TaskQueue struct {
- TaskQueueLen int
- allFuns chan func()
- doneRun chan struct{}
- wg sync.WaitGroup
- }
- func (t *TaskQueue) StartSequenceTaskProcess(taskQueueLen int) {
- t.TaskQueueLen = taskQueueLen
- if t.TaskQueueLen == 0 {
- t.TaskQueueLen = defaultFunLen
- }
- t.allFuns = make(chan func(), t.TaskQueueLen)
- t.wg.Add(1)
- go t.run()
- }
- func (t *TaskQueue) StopSequenceTaskProcess() {
- close(t.doneRun)
- close(t.allFuns)
- t.wg.Wait()
- }
- func (t *TaskQueue) AddTask(f func()) bool {
- if len(t.allFuns) >= t.TaskQueueLen {
- return false
- }
- t.allFuns <- f
- return true
- }
- func (t *TaskQueue) run() {
- defer t.wg.Done()
- t.doneRun = make(chan struct{})
- safeExec := func(f func()) {
- defer func() {
- if err := recover(); err != nil {
- log.Warnln("timercall exec panic:", err)
- }
- }()
- f()
- }
- for {
- select {
- case <-t.doneRun:
- return
- case f, ok := <-t.allFuns:
- if !ok {
- return
- }
- safeExec(f)
- }
- }
- }
|