| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package wkrp
- import "git.wenlab.co/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)
- }
|