worker.go 1.1 KB
Newer Older
T
tanggen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
package workerpool

import (
	"fmt"
)

var (
	maxQueue = 200
)

// Worker represents the worker that executes the job
type worker struct {
	workerPool *WorkerPool
	//as a lock for this job
	jobChannel chan Job
	quit       chan bool
	id         int
}

func newWorker(workerPool *WorkerPool) worker {
	return worker{
		workerPool: workerPool,
		jobChannel: make(chan Job),
		quit:       make(chan bool),
	}
}

// Start method starts the run loop for the worker, listening for a quit channel in
// case we need to stop it
func (w worker) start() {
	go func() {
		for {
			// register the current worker into the worker queue.
			w.workerPool.jobPool <- w.jobChannel

			select {
			case job := <-w.jobChannel:
				// we have received a work request.
				if err := w.workerPool.handler(job.payload); err != nil {
					fmt.Printf("Error handling: %s", err.Error())
				}

			case <-w.quit:
				// we have received a signal to stop
				return
			}
		}
	}()
}

// Stop signals the worker to stop listening for work requests.
func (w worker) stop() {
	go func() {
		w.quit <- true
	}()
}