From bede26dbd06e546261eebcd02e6387d53263d269 Mon Sep 17 00:00:00 2001 From: Andrey Ivanov Date: Tue, 21 Jul 2020 09:35:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BC=D0=B5=D0=B6=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hw05_parallel_execution/run.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/hw05_parallel_execution/run.go b/hw05_parallel_execution/run.go index 54bfeef..da2eb65 100644 --- a/hw05_parallel_execution/run.go +++ b/hw05_parallel_execution/run.go @@ -9,25 +9,31 @@ import ( var ErrErrorsLimitExceeded = errors.New("errors limit exceeded") type Task func() error +type Errors struct { + count int + mx sync.Mutex +} -// Run starts tasks in N goroutines and stops its work when receiving M errors from tasks -func Run(tasks []Task, N int, M int) error { - log.Println("Tasks:", len(tasks), "| Goroutines:", N, "| Errors:", M) - errs := 0 - for i := 0; i < len(tasks); i = i + N { +func Run(tasks []Task, n int, m int) error { + log.Println("Tasks:", len(tasks), "| Goroutines:", n, "| Errors:", m) + errs := Errors{} + for i := 0; i < len(tasks); i += n { wg := sync.WaitGroup{} - for g := 1; g <= N && i+g < len(tasks); g++ { + for g := 1; g <= n && i+g < len(tasks); g++ { wg.Add(1) - go func(rt Task, i int, g int, errs *int) { - if err := rt; err != nil { - *errs++ + go func(rt Task, errs *Errors) { + err := rt + if err != nil { + errs.mx.Lock() + errs.count++ + errs.mx.Unlock() } wg.Done() - }(tasks[i+g], i, g, &errs) + }(tasks[i+g], &errs) } wg.Wait() - if errs > M { - log.Println("Produced", errs, "errors of", M) + if errs.count > m { + log.Println("Produced", errs.count, "errors of", m) return ErrErrorsLimitExceeded } }