package wkrp import "git.wanbits.io/joe/kettle/utl" /** worker managed by dispatcher */ type Worker struct { id int jobChan utl.TJobChan pool utl.TJobPool disp *Dispacher quit chan struct{} running bool err error } func newWorker(id int, dispacher *Dispacher) *Worker { return &Worker{ id: id, jobChan: make(utl.TJobChan, 1), pool: dispacher.pool, disp: dispacher, quit: make(chan struct{}), running: false, err: nil, } } func (self *Worker) alive() bool { return self.running } func (self *Worker) error() error { return self.err } func (self *Worker) start() { defer func() { if err := recover(); err != nil { } self.running = false self.disp.wg.Done() }() go func() { self.running = true for { self.pool <- self.jobChan select { case job, ok := <-self.jobChan: if !ok { return } self.err = job.Do() case <-self.quit: for job := range self.jobChan { self.err = job.Do() } close(self.jobChan) return } } }() } func (self *Worker) stop() { close(self.quit) }