馃敟 TIME, MANEJO DE TIMEOUTS

驴Qu茅 significa el t茅rmino timeout?

Un timeout es el tiempo m谩ximo de ejecuci贸n que un programa puede esperar antes de abortar su ejecuci贸n.

驴C贸mo definir timeouts en Go?

Imagin茅monos que tenemos una funci贸n que consulta los datos desde un servidor, por ejemplo haciendo uso de http.Get, sin embargo puede darse el caso que exista una ca铆da en el api que estamos consultando, lo que dejar铆a colgado el proceso debido a que no recibir铆amos respuesta, o al menos no estar铆amos definiendo el tiempo l铆mite para dicha consulta.

Ejemplo del uso de timeouts en Go

package main

import (
    "fmt"
    "time"
)

func leerApi() string {
    time.Sleep(5 * time.Second)
    return "respuesta del api"
}

func main() {

    c1 := make(chan string, 1)

    go func() {
        c1 <- leerApi()
    }()

    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(3 * time.Second):
        fmt.Println("timeout")
    }
}

Descripci贸n del ejemplo del uso de timeouts en Go

  • Una funci贸n que toma 5 segundos para leer la respuesta de una API (esto es una simulaci贸n).
func leerApi() string {
    time.Sleep(5 * time.Second)
    return "respuesta del api"
}
  • Un canal para solicitar/recibir los datos.
c1 := make(chan string, 1)
  • Para hacer la llamada as铆ncrona, debemos invocar la funci贸n leerApi() y asignamos el valor al canal.
go func() {
    c1 <- leerApi()
}()
  • Ahora utilizamos un selecta que cubre 2 escenarios. El primero asignamos el valor asignado a c1 y en el segundo se dispara cuando el tiempo se agota, es decir 3 segundos despu茅s.
select {
case res := <-c1:
    fmt.Println(res)
case <-time.After(3 * time.Second):
    fmt.Println("timeout")
}

Si ejecutamos el programa la primer condici贸n en cumplirse es el timeout, debido a que 3 segundos ocurren antes que 5 segundos. Por lo que el programa imprimir谩 “timeout”.

Si reducimos el tiempo de la funci贸n del api a 2 segundos y volvemos a ejecutar, obtendremos ahora como salida “respuesta del api”.

Definir un timeout en un programa nos permite prevenir escenarios en donde la respuesta esperada se pierde en la red o tarda demasiado en llegar.