package timeslice import ( "context" "fmt" "golang.org/x/sync/errgroup" "math/rand" "testing" "time" ) func ProcessTasks() error { eg := new(errgroup.Group) eg.SetLimit(5) for i := 0; i < 5; i++ { eg.Go(func() error { // 任务逻辑... time.Sleep(100 * time.Millisecond) return fmt.Errorf("任务失败") }) } return eg.Wait() // 仅返回第一个错误 } func TestNewManager(t *testing.T) { // 解析起始时间和结束时间 start, err := time.Parse(time.DateTime, "2023-01-01 00:00:00") if err != nil { t.Fatalf("查询失败: %v", err) return } //end, err := time.Parse(time.DateTime, "2023-01-31 02:00:01") end, err := time.Parse(time.DateTime, "2023-01-02 02:00:01") if err != nil { t.Fatalf("查询失败: %v", err) return } var results []string callback := func(ctx context.Context, req *Task) error { // 模拟任务执行,休眠随机时间 time.Sleep(time.Duration(rand.Intn(5)) * time.Second) // 生成任务执行结果 result := fmt.Sprintf("任务批次 %d-%s: %s 至 %s 处理完成", req.TaskID, req.ProductNo, req.CurrentStartTime.Format(time.DateTime), req.CurrentEndTime.Format(time.DateTime)) results = append(results, result) //return nil return fmt.Errorf("任务执行失败:%d-%s,时间%s-%s", req.TaskID, req.ProductNo, req.CurrentStartTime.Format(time.DateTime), req.CurrentEndTime.Format(time.DateTime)) } startTime := time.Now() startStr := time.Now().String() srv := NewManager(callback) taskCount, err := srv.Run(context.Background(), &Manager{ StartTime: start, EndTime: end, ProductNo: "123456", GoNum: 2, }) // 输出结果 fmt.Printf("总任务数:%d\n", taskCount) for _, result := range results { fmt.Printf("%v\n", result) } if err != nil { t.Error(err) } endTime := time.Now() fmt.Printf("处理耗时:%s,开始处理时间:%s,结束时间%s", startStr, endTime.Sub(startTime).String(), endTime.String()) }