gitee.com/h79/goutils@v1.22.10/common/scheduler/pool_worker.go (about)

     1  package scheduler
     2  
     3  import (
     4  	"gitee.com/h79/goutils/common/system"
     5  )
     6  
     7  type jobWorker struct {
     8  	running system.RunningCheck
     9  	pool    *Pool
    10  	job     chan *Job
    11  	stop    chan int
    12  }
    13  
    14  func (w *jobWorker) start() {
    15  	w.running.GoRunning(w.run)
    16  }
    17  
    18  func (w *jobWorker) run() {
    19  	w.pool.workerRunning()
    20  	defer w.pool.workerQuit()
    21  	for {
    22  		w.pool.idleWork(w) //把idle work放进去
    23  		select {
    24  		case job := <-w.job:
    25  			_, _ = job.Execute()
    26  			w.pool.workerIdle()
    27  		case s := <-w.stop:
    28  			w.stopJob(s)
    29  			w.stop <- 1
    30  			return
    31  		}
    32  	}
    33  }
    34  
    35  func newWorker(pool *Pool) *jobWorker {
    36  	return &jobWorker{
    37  		pool: pool,
    38  		job:  make(chan *Job),
    39  		stop: make(chan int),
    40  	}
    41  }
    42  
    43  func (w *jobWorker) stopJob(s int) {
    44  	var opts = With(s)
    45  	for i := 0; i < len(w.job); i++ {
    46  		job, ok := <-w.job
    47  		if !ok {
    48  			return
    49  		}
    50  		_, _ = job.Execute(opts...)
    51  	}
    52  }