HW05 готово (способ 1 - пилообразный сдвиг)

pull/5/head
Andrey Ivanov 2020-07-21 15:19:50 +03:00 committed by Andrey Ivanov
parent c9dd112ed6
commit 5d4865b549
2 changed files with 37 additions and 3 deletions

View File

@ -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
}

View File

@ -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++ {