Как выполнять jobs последовательно и сообщать прогресс

После i-го успешного задания отправляйте 100*i/n. Отправка должна учитывать отмену, иначе медленный или ушедший получатель заблокирует выполнение.

Короткий ответ

Что ответить на собеседовании

После i-го успешного задания отправляйте 100*i/n. Отправка должна учитывать отмену, иначе медленный или ушедший получатель заблокирует выполнение.

Подробный разбор

Ответ с пояснениями

Условие

В Go есть jobs — срез функций func(context.Context) error. Выполняйте их по порядку, отправляйте процент после каждого успеха в progress и останавливайтесь при ошибке или отмене. Функция единственная закрывает progress.

Ответ

После i-го успешного задания отправляйте 100*i/n. Отправка должна учитывать отмену, иначе медленный или ушедший получатель заблокирует выполнение.

Схема реализации:

func Run(ctx context.Context, jobs []func(context.Context) error, progress chan<- int) error {
    defer close(progress)
    for i, job := range jobs {
        if err := ctx.Err(); err != nil { return err }
        if err := job(ctx); err != nil { return err }
        percent := int(100 * float64(i+1) / float64(len(jobs)))
        select {
        case progress <- percent:
        case <-ctx.Done(): return ctx.Err()
        }
    }
    return nil
}

Пустой список завершается без сообщений; успешный непустой — сообщением 100. Это часть выбранного контракта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее