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
GetDevuelve un error? Estoy un poco confundido porque Godoc paraClientdice: 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 lecturaGeto la lecturaResponse.Bodypodrían verse interrumpidas por un error?http.Client.Timeoutvs.http.Transport.ResponseHeaderTimeout?http.Client.Timeoutincluye el tiempo para leer el cuerpo de la respuesta,http.Transport.ResponseHeaderTimeoutno 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.SetDeadlineque 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 * 45Ayú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
ResponseHeaderTimeoutcomienza solo después de que se establece la conexión.fuente