From 5d4865b549611daf21c35f0fe470d1cd1497ebb0 Mon Sep 17 00:00:00 2001 From: Andrey Ivanov <tiburon-777@users.noreply.github.com> Date: Tue, 21 Jul 2020 15:19:50 +0300 Subject: [PATCH] =?UTF-8?q?HW05=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE=20(?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=201=20-=20=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D0=BE=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=81=D0=B4=D0=B2=D0=B8=D0=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hw05_parallel_execution/run.go | 4 ++-- hw05_parallel_execution/run_test.go | 36 ++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) 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++ {