HW05 готово (способ 1 - пилообразный сдвиг)
This commit is contained in:
parent
c9dd112ed6
commit
5d4865b549
@ -23,7 +23,7 @@ func Run(tasks []Task, n int, m int) error {
|
|||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func(rt Task, errs *Errors) {
|
go func(rt Task, errs *Errors) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
err := rt
|
err := rt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs.mx.Lock()
|
errs.mx.Lock()
|
||||||
errs.count++
|
errs.count++
|
||||||
@ -32,7 +32,7 @@ func Run(tasks []Task, n int, m int) error {
|
|||||||
}(tasks[i+g], &errs)
|
}(tasks[i+g], &errs)
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
if errs.count > m {
|
if m > 0 && errs.count > m {
|
||||||
log.Println("Produced", errs.count, "errors of", m)
|
log.Println("Produced", errs.count, "errors of", m)
|
||||||
return ErrErrorsLimitExceeded
|
return ErrErrorsLimitExceeded
|
||||||
}
|
}
|
||||||
|
@ -37,11 +37,45 @@ func TestRun(t *testing.T) {
|
|||||||
require.LessOrEqual(t, runTasksCount, int32(workersCount+maxErrorsCount), "extra tasks were started")
|
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) {
|
t.Run("tasks without errors", func(t *testing.T) {
|
||||||
tasksCount := 50
|
tasksCount := 50
|
||||||
tasks := make([]Task, 0, tasksCount)
|
tasks := make([]Task, 0, tasksCount)
|
||||||
|
|
||||||
var runTasksCount int32
|
var runTasksCount int32 = 1
|
||||||
var sumTime time.Duration
|
var sumTime time.Duration
|
||||||
|
|
||||||
for i := 0; i < tasksCount; i++ {
|
for i := 0; i < tasksCount; i++ {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user