Estou fazendo um buscador de URL no Go e tenho uma lista de URLs para buscar. Eu envio http.Get()
solicitações para cada URL e obtenho sua resposta.
resp,fetch_err := http.Get(url)
Como posso definir um tempo limite personalizado para cada solicitação Get? (O tempo padrão é muito longo e isso torna meu buscador muito lento.) Eu quero que meu buscador tenha um tempo limite de cerca de 40-45 segundos, após o qual ele deve retornar "tempo limite da solicitação esgotado" e seguir para a próxima URL.
Como posso conseguir isso?
Respostas:
Aparentemente no Go 1.3 http.Client tem o campo Timeout
Isso fez o truque para mim.
fonte
Get
um erro? Estou um pouco confuso porque o Godoc paraClient
diz: O cronômetro continua em execução após o retorno Get, Head, Post ou Do e interromperá a leitura do Response.Body. Então, isso significa que a leituraGet
ouResponse.Body
pode ser interrompida por um erro?http.Client.Timeout
vs.http.Transport.ResponseHeaderTimeout
?http.Client.Timeout
inclui o tempo de leitura do corpo da resposta,http.Transport.ResponseHeaderTimeout
não inclui.Você precisa configurar seu próprio Cliente com seu próprio Transporte, que usa uma função de discagem personalizada que envolve DialTimeout .
Algo como (completamente não testado ) isto :
fonte
Para adicionar à resposta de Volker, se você também gostaria de definir o tempo limite de leitura / gravação além do tempo limite de conexão, você pode fazer algo como o seguinte
Este código foi testado e está funcionando em produção. A essência completa com testes está disponível aqui https://gist.github.com/dmichael/5710968
Esteja ciente de que você precisará criar um novo cliente para cada solicitação por causa do
conn.SetDeadline
qual faz referência a um ponto no futuro detime.Now()
fonte
Se você quiser fazer isso por solicitação, tratamento de erros ignorado por questões de brevidade:
fonte
http.Client.Timeout
.Uma maneira rápida e suja:
Este é um estado global mutante sem qualquer coordenação. No entanto, pode ser adequado para seu coletor de urls. Caso contrário, crie uma instância privada de
http.RoundTripper
:Nada acima foi testado.
fonte
http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45
me ajude muito no teste de gravação para o tempo limite do pedido. Muito obrigado.Você pode usar https://github.com/franela/goreq, que lida com os tempos limite de uma maneira simples.
fonte
Isso pode ajudar, mas observe que
ResponseHeaderTimeout
começa somente depois que a conexão é estabelecida.fonte