Estoy creando un buscador de URL en Go y tengo una lista de URL para buscar. Envío http.Get()
solicitudes a cada URL y obtengo su respuesta.
resp,fetch_err := http.Get(url)
¿Cómo puedo establecer un tiempo de espera personalizado para cada solicitud de obtención? (El tiempo predeterminado es muy largo y eso hace que mi buscador sea muy lento.) Quiero que mi buscador tenga un tiempo de espera de alrededor de 40-45 segundos, después de lo cual debería devolver "solicitud agotada" y pasar a la siguiente URL.
¿Cómo puedo conseguir esto?
Respuestas:
Aparentemente, en Go 1.3 http.El cliente tiene un campo de tiempo de espera
Eso me ha funcionado.
fuente
Get
Devuelve un error? Estoy un poco confundido porque Godoc paraClient
dice: El temporizador sigue funcionando después de que Get, Head, Post o Do regresen e interrumpirá la lectura de Response.Body. Entonces, ¿eso significa que la lecturaGet
o la lecturaResponse.Body
podrían verse interrumpidas por un error?http.Client.Timeout
vs.http.Transport.ResponseHeaderTimeout
?http.Client.Timeout
incluye el tiempo para leer el cuerpo de la respuesta,http.Transport.ResponseHeaderTimeout
no lo incluye.Debe configurar su propio cliente con su propio transporte, que utiliza una función de marcado personalizada que envuelve DialTimeout .
Algo como (completamente no probado ) esto :
fuente
Para agregar a la respuesta de Volker, si también desea establecer el tiempo de espera de lectura / escritura además del tiempo de espera de conexión, puede hacer algo como lo siguiente
Este código está probado y está funcionando en producción. La esencia completa con las pruebas está disponible aquí https://gist.github.com/dmichael/5710968
Tenga en cuenta que deberá crear un nuevo cliente para cada solicitud debido a
conn.SetDeadline
que hace referencia a un punto en el futuro desdetime.Now()
fuente
Si desea hacerlo por solicitud, se ignora el manejo de errores por brevedad:
fuente
http.Client.Timeout
.Una forma rápida y sucia:
Este es un estado global mutante sin ninguna coordinación. Sin embargo, posiblemente esté bien para su buscador de URL. De lo contrario, cree una instancia privada de
http.RoundTripper
:Nada de lo anterior fue probado.
fuente
http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45
Ayúdame mucho en la prueba de escritura para solicitar el tiempo de espera. Muchas gracias.Puede utilizar https://github.com/franela/goreq, que gestiona los tiempos de espera de forma sencilla y moderna.
fuente
Esto puede ayudar, pero tenga en cuenta que
ResponseHeaderTimeout
comienza solo después de que se establece la conexión.fuente