package wkrp /** worker managed by dispatcher */ type TJobChan chan Tjob type TJobPool chan TJobChan type Worker struct { id int jobChan TJobChan pool TJobPool quit chan struct{} running bool err error } func newWorker(id int, pool TJobPool) *Worker { return &Worker{ id: id, jobChan: make(chan Tjob, 1), pool: pool, 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() { self.running = false if err := recover(); err != nil { } }() go func() { self.running = true for { self.pool <- self.jobChan select { case job, ok := <-self.jobChan: if !ok { return } self.err = job() case <-self.quit: close(self.jobChan) return } } }() } func (self *Worker) Stop() { go func() { close(self.quit) }() }