Maison > développement back-end > Golang > Comment arrêter progressivement un serveur HTTP après avoir renvoyé une réponse ?

Comment arrêter progressivement un serveur HTTP après avoir renvoyé une réponse ?

Barbara Streisand
Libérer: 2024-10-29 09:10:02
original
1058 Les gens l'ont consulté

How to Gracefully Shut Down an HTTP Server After Returning a Response?

Arrêter le serveur HTTP après avoir renvoyé la réponse

Vous développez un robot en ligne de commande qui interagit avec l'API Instagram à l'aide d'OAuth, qui n'est pas optimisé pour la ligne de commande candidatures. Pour surmonter ce problème, vous avez configuré un serveur HTTP local comme URI de redirection pour l'autorisation. Une fois que l'utilisateur a autorisé l'application et est redirigé vers le serveur, vous souhaitez arrêter le serveur une fois le jeton d'accès affiché.

Vous avez rencontré un problème lors de la mise en œuvre du mécanisme d'arrêt. Plus précisément, appeler srv.Shutdown(nil) dans le gestionnaire de requêtes (showTokenToUser) entraîne une erreur :

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
Copier après la connexion

Solution

Le problème survient parce que vous appelez srv.Shutdown(nil) plusieurs fois :

  1. Dans le gestionnaire showTokenToUser, où il se trouve dans une fermeture.
  2. Une fois l'exécution du gestionnaire terminée dans la fonction principale.

Appel srv.Shutdown alors que le serveur est toujours à l'écoute des connexions entraîne une condition de concurrence critique. La goroutine ListenAndServe() tente de fermer les écouteurs ouverts et les connexions inactives, mais elle est interrompue par l'appel ultérieur à Shutdown lors de la fermeture du gestionnaire. Cette incohérence d'état déclenche la panique.

Pour résoudre ce problème, vous pouvez utiliser l'une des deux méthodes suivantes :

1. Utilisez context.WithCancel :

Dans cette approche, vous créez un context.Context avec une fonction d'annulation. Le contexte est transmis à la goroutine ListenAndServe et à la fonction de gestionnaire showTokenToUser. À l'intérieur du gestionnaire, lorsque le jeton d'accès a été affiché à l'utilisateur, vous appelez la fonction d'annulation pour mettre fin au contexte. La goroutine ListenAndServe arrêtera gracieusement le serveur lorsque le contexte sera annulé.

2. Utilisez le même Context :

Au lieu d'appeler context.WithCancel, vous pouvez transmettre le même context.Context à la goroutine ListenAndServe et à la fonction de gestionnaire. Lorsque le jeton d'accès est affiché, vous appelez Cancel() sur le contexte, ce qui déclenchera l'arrêt du gestionnaire et de la goroutine ListenAndServe.

Après avoir implémenté l'une ou l'autre approche, n'oubliez pas d'attendre la fonction srv.Shutdown à terminer avant de quitter le programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal