Senior
// Es ist notwendig, die Wrapper-Funktion zu ändern, die mit einem festgelegten Timeout arbeitet (z.B. 1 Sekunde). // Wenn die "lange" Funktion innerhalb dieser Zeit ausgeführt wurde, ist das großartig, wir geben das Ergebnis zurück. // Wenn nicht, geben wir einen Fehler zurück. Das Ergebnis der Ausführung ist in diesem Fall nicht wichtig. // // Zusätzlich muss gemessen werden, wie lange diese Funktion lief (einfach im Log ausgeben). // Die Signatur der Wrapper-Funktion kann geändert werden.
sobes.tech KI
Antwort von AI
Ниже пример функции-обёртки в Go, которая запускает переданную функцию с таймаутом 1 секунду, измеряет время выполнения и возвращает ошибку, если время вышло:
package main
import (
"errors"
"log"
"time"
)
// TimeoutWrapper запускает функцию fn с таймаутом timeout
func TimeoutWrapper(fn func() (interface{}, error), timeout time.Duration) (interface{}, error) {
start := time.Now()
resultChan := make(chan interface{})
errChan := make(chan error)
go func() {
res, err := fn()
if err != nil {
errChan <- err
return
}
resultChan <- res
}()
select {
case res := <-resultChan:
elapsed := time.Since(start)
log.Printf("Function completed in %v", elapsed)
return res, nil
case err := <-errChan:
elapsed := time.Since(start)
log.Printf("Function errored in %v", elapsed)
return nil, err
case <-time.After(timeout):
elapsed := time.Since(start)
log.Printf("Function timed out after %v", elapsed)
return nil, errors.New("function timed out")
}
}
// Пример "длинной" функции
func longFunc() (interface{}, error) {
time.Sleep(2 * time.Second) // имитация долгой работы
return "done", nil
}
func main() {
res, err := TimeoutWrapper(longFunc, 1*time.Second)
if err != nil {
log.Println("Error:", err)
} else {
log.Println("Result:", res)
}
}
В этом примере функция TimeoutWrapper запускает переданную функцию в горутине, ждёт её результат или ошибку, либо таймаут. Время выполнения логируется в любом случае.