worker.go 969 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package wkrp
  2. /**
  3. worker managed by dispatcher
  4. */
  5. type TJobChan chan Tjob
  6. type TJobPool chan TJobChan
  7. type Worker struct {
  8. id int
  9. jobChan TJobChan
  10. pool TJobPool
  11. quit chan struct{}
  12. running bool
  13. err error
  14. }
  15. func newWorker(id int, pool TJobPool) *Worker {
  16. return &Worker{
  17. id: id,
  18. jobChan: make(chan Tjob, 1),
  19. pool: pool,
  20. quit: make(chan struct{}),
  21. running: false,
  22. err: nil,
  23. }
  24. }
  25. func (self *Worker) alive() bool {
  26. return self.running
  27. }
  28. func (self *Worker) error() error {
  29. return self.err
  30. }
  31. func (self *Worker) start() {
  32. defer func() {
  33. self.running = false
  34. if err := recover(); err != nil {
  35. }
  36. }()
  37. go func() {
  38. self.running = true
  39. for {
  40. self.pool <- self.jobChan
  41. select {
  42. case job, ok := <-self.jobChan:
  43. if !ok {
  44. return
  45. }
  46. self.err = job()
  47. case <-self.quit:
  48. close(self.jobChan)
  49. return
  50. }
  51. }
  52. }()
  53. }
  54. func (self *Worker) Stop() {
  55. go func() { close(self.quit) }()
  56. }