| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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) }()
- }
|