HW05 готово (способ 1 - пилообразный сдвиг)
parent
c9dd112ed6
commit
5d4865b549
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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++ {
|
||||
|
|
Loading…
Reference in New Issue