diff --git a/hw05_parallel_execution/run.go b/hw05_parallel_execution/run.go index 241a058..a01b12e 100644 --- a/hw05_parallel_execution/run.go +++ b/hw05_parallel_execution/run.go @@ -23,7 +23,7 @@ func Run(tasks []Task, n int, m int) error { wg.Add(1) go func(rt Task, errs *Errors) { defer wg.Done() - err := rt + err := rt() if err != nil { errs.mx.Lock() errs.count++ @@ -32,7 +32,7 @@ func Run(tasks []Task, n int, m int) error { }(tasks[i+g], &errs) } wg.Wait() - if errs.count > m { + if m > 0 && errs.count > m { log.Println("Produced", errs.count, "errors of", m) return ErrErrorsLimitExceeded } diff --git a/hw05_parallel_execution/run_test.go b/hw05_parallel_execution/run_test.go index d1157c8..78b742d 100644 --- a/hw05_parallel_execution/run_test.go +++ b/hw05_parallel_execution/run_test.go @@ -37,11 +37,45 @@ func TestRun(t *testing.T) { require.LessOrEqual(t, runTasksCount, int32(workersCount+maxErrorsCount), "extra tasks were started") }) + t.Run("if m<0 then ignore errores", func(t *testing.T) { + tasksCount := 50 + tasks := make([]Task, 0, tasksCount) + + var runTasksCount int32 = 1 + var sumTime time.Duration + + for i := 0; i < tasksCount; i++ { + err := fmt.Errorf("error from task %d", i) + taskSleep := time.Millisecond * time.Duration(rand.Intn(100)) + sumTime += taskSleep + + tasks = append(tasks, func() error { + time.Sleep(taskSleep) + atomic.AddInt32(&runTasksCount, 1) + if i%2 == 0 { + return err + } + return nil + }) + } + + workersCount := 5 + maxErrorsCount := -1 + + start := time.Now() + result := Run(tasks, workersCount, maxErrorsCount) + elapsedTime := time.Since(start) + require.Nil(t, result) + + require.Equal(t, runTasksCount, int32(tasksCount), "not all tasks were completed") + require.LessOrEqual(t, int64(elapsedTime), int64(sumTime/2), "tasks were run sequentially?") + }) + t.Run("tasks without errors", func(t *testing.T) { tasksCount := 50 tasks := make([]Task, 0, tasksCount) - var runTasksCount int32 + var runTasksCount int32 = 1 var sumTime time.Duration for i := 0; i < tasksCount; i++ {