routinetriger.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package trigger
  2. import (
  3. "leafstalk/log"
  4. "time"
  5. )
  6. type RoutineTrigger struct {
  7. chNotify chan struct{}
  8. doneRun chan struct{}
  9. }
  10. // 启动协程,手动触发协程函数的执行
  11. func (r *RoutineTrigger) StrartRoutine(f func()) {
  12. r.chNotify = make(chan struct{}, 1)
  13. r.doneRun = make(chan struct{})
  14. safeExec := func(f func()) {
  15. defer func() {
  16. if err := recover(); err != nil {
  17. log.Warnln("timercall exec panic:", err)
  18. }
  19. }()
  20. f()
  21. }
  22. go func() {
  23. for {
  24. select {
  25. case <-r.chNotify:
  26. safeExec(f)
  27. case <-r.doneRun:
  28. return
  29. }
  30. }
  31. }()
  32. }
  33. // 启动协程,手动触发协程函数的执行, 并且也会定时自动执行协程函数
  34. func (r *RoutineTrigger) StrartTimerRoutine(f func(), d time.Duration) {
  35. r.chNotify = make(chan struct{}, 1)
  36. r.doneRun = make(chan struct{})
  37. ticker := time.NewTicker(d)
  38. safeExec := func(f func()) {
  39. defer func() {
  40. if err := recover(); err != nil {
  41. log.Warnln("timercall exec panic:", err)
  42. }
  43. }()
  44. f()
  45. }
  46. go func() {
  47. for {
  48. select {
  49. case <-r.chNotify:
  50. safeExec(f)
  51. case <-r.doneRun:
  52. ticker.Stop()
  53. return
  54. case <-ticker.C:
  55. safeExec(f)
  56. }
  57. }
  58. }()
  59. }
  60. func (r *RoutineTrigger) Trigger() {
  61. select {
  62. case r.chNotify <- struct{}{}:
  63. default:
  64. }
  65. }
  66. func (r *RoutineTrigger) Stop() {
  67. close(r.doneRun)
  68. }