Назад к задачам
AvitoПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
50
Декоратор с ограничением времени выполнения и логированием для медленной функции
Компании, где спрашивали:
Условие задачи
Требуется написать обёртку вокруг функции, которая может работать неопределённо долго и возвращать целочисленное значение. Тело этой функции менять нельзя – представим, что внутри происходит сетевой запрос или другая тяжёлая операция. Обёртка должна запускать функцию с установленным тайм‑аутом (например, одной секунды): если функция успевает завершиться за отведённое время – возвращаем её результат, иначе – возвращаем ошибку, при этом полученный результат игнорируем. Кроме того, необходимо измерять длительность выполнения функции и выводить её в лог. Сигнатуру обёртки разрешено изменить.
package main
import (
"fmt"
"math/rand"
"time"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
// Есть функция, работающая неопределённо долго и возвращающая число.
// Её тело нельзя изменить (представим, что внутри сетевой запрос).
func unpredictableFunc() int64 {
rnd := rand.Int63n(5000)
time.Sleep(time.Duration(rnd) * time.Millisecond)
return rnd
}
// Нужно изменить функцию обёртку, которая будет работать с заданным таймаутом (например, 1 секунду).
// Если "длинная" функция отработала за это время — отлично, возвращаем результат.
// Если нет — возвращаем ошибку. Результат работы в этом случае нам не важен.
// Дополнительно нужно измерить, сколько выполнялась эта функция (просто вывести в лог).
// Сигнатуру функции обёртки менять можно.
func predictableFunc() int64 {
return unpredictableFunc()
}
func main() {
fmt.Println("Started")
fmt.Println(predictableFunc())
}