Je crée un récupérateur d'URL dans Go et j'ai une liste d'URL à récupérer. J'envoie des http.Get()
requêtes à chaque URL et j'obtiens leur réponse.
resp,fetch_err := http.Get(url)
Comment puis-je définir un délai d'expiration personnalisé pour chaque demande Get? (Le temps par défaut est très long et cela rend mon récupérateur vraiment lent.) Je veux que mon récupérateur ait un délai d'attente d'environ 40 à 45 secondes après quoi il devrait renvoyer "requête expirée" et passer à l'URL suivante.
Comment puis-je atteindre cet objectif?
Réponses:
Apparemment, dans Go 1.3, http.Client a un champ Timeout
Cela a fait l'affaire pour moi.
la source
Get
une erreur? Je suis un peu confus car le Godoc pourClient
dit: Le minuteur continue de fonctionner après le retour de Get, Head, Post ou Do et interrompra la lecture de Response.Body. Cela signifie-t-il que l' unGet
ou l' autre ou la lectureResponse.Body
pourrait être interrompu par une erreur?http.Client.Timeout
vs.http.Transport.ResponseHeaderTimeout
?http.Client.Timeout
inclut le temps de lecture du corps de la réponse,http.Transport.ResponseHeaderTimeout
ne l'inclut pas.Vous devez configurer votre propre client avec votre propre transport qui utilise une fonction de numérotation personnalisée qui entoure DialTimeout .
Quelque chose comme (complètement non testé ) ceci :
la source
Pour ajouter à la réponse de Volker, si vous souhaitez également définir le délai de lecture / écriture en plus du délai de connexion, vous pouvez faire quelque chose comme ce qui suit
Ce code est testé et fonctionne en production. L'essentiel avec les tests est disponible ici https://gist.github.com/dmichael/5710968
Sachez que vous devrez créer un nouveau client pour chaque demande en raison du
conn.SetDeadline
qui fait référence à un point dans le futur à partir detime.Now()
la source
Si vous voulez le faire par requête, la gestion des erreurs est ignorée par souci de concision:
la source
http.Client.Timeout
.Une manière rapide et sale:
C'est un état mondial en mutation sans aucune coordination. Pourtant, cela peut convenir à votre récupérateur d'URL. Sinon, créez une instance privée de
http.RoundTripper
:Rien ci-dessus n'a été testé.
la source
http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45
Aidez-moi beaucoup à écrire un test pour le délai d'expiration de la demande. Merci beaucoup.Vous pouvez utiliser https://github.com/franela/goreq qui gère les délais d'expiration de manière simple et simple.
la source
Cela peut aider, mais remarquez que cela
ResponseHeaderTimeout
ne démarre qu'après l'établissement de la connexion.la source