tasker.go 920 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2019 getensh.com. All rights reserved.
  2. // Use of this source code is governed by getensh.com.
  3. package rpctasker
  4. import (
  5. "context"
  6. "fmt"
  7. "runtime"
  8. "git.getensh.com/common/gopkgsv2/tasker"
  9. )
  10. // 打印调用者函数名
  11. func callerName() string {
  12. pc, _, _, _ := runtime.Caller(2)
  13. return runtime.FuncForPC(pc).Name()
  14. }
  15. // Task 任务函数
  16. type Task func() error
  17. // Exec 执行任务
  18. func Exec(ctx context.Context, tasks ...Task) (err error) {
  19. // 进程中断中,不再处理任务
  20. if tasker.Interrupted() {
  21. return tasker.InterruptError
  22. }
  23. // 抓异常代码
  24. defer func() {
  25. if r := recover(); r != nil {
  26. if e, ok := r.(error); ok {
  27. err = e
  28. } else {
  29. err = fmt.Errorf("%+v", r)
  30. }
  31. // 这里必须返回
  32. return
  33. }
  34. }()
  35. // 按顺序执行任务
  36. for _, task := range tasks {
  37. if task != nil {
  38. if err = task(); err != nil {
  39. panic(err)
  40. }
  41. }
  42. }
  43. return
  44. }