После i-го успешного задания отправляйте 100*i/n. Отправка должна учитывать отмену, иначе медленный или ушедший получатель заблокирует выполнение.
Как выполнять jobs последовательно и сообщать прогресс
После 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. Это часть выбранного контракта.