Comment arrêter http.ListenAndServe()
Je suis en utilisant le Mux de la bibliothèque de Gorille Web Toolkit le long avec le logiciel d'Aller à l'adresse http du serveur.
Le problème est que dans mon application, le serveur HTTP n'est qu'un élément et il est nécessaire d'arrêter et démarrer à ma discrétion.
Quand je l'appelle http.ListenAndServe(fmt.Sprintf(":%d", service.Port()), service.router)
il bloque et je n'arrive pas à arrêter le serveur en cours d'exécution.
Je suis conscient que cela a été un problème dans le passé, est-ce toujours le cas? Existe-il des solutions nouvelles?
Vous devez vous connecter pour publier un commentaire.
Concernant la fermeture en douceur (introduit en Aller 1.8), un peu plus exemple concret:
nil
àsrv.Shutdown
- je obtenirpanic: runtime error: invalid memory address or nil pointer dereference
. En passantcontext.Todo()
au lieu de cela fonctionne.ListenAndServe()
et de l'avoir envoyer de l'erreur sur unechan error
pour le thread principal. Donc, je bloque le thread principal, et recevoir le message d'erreur là pour faire ce que je veux avec elle sur le thread principal lorsque le serveur s'arrête 🙂 en réalité, j'ai une nouvelle question: stackoverflow.com/questions/53907970/... et avoir ma solution posté dans mon edit.Comme mentionné dans
yo.ian.g
's réponse. Aller 1.8 a inclus cette fonctionnalité dans la lib standard.Exemple Minimal pour pour
Go 1.8+
:Réponse Originale À Cette Question - Pré Aller 1.8 :
Bâtiment sur Uvelichitel de l' réponse.
Vous pouvez créer votre propre version de
ListenAndServe
qui retourne unio.Closer
et ne se bloque pas.Code complet disponible ici.
HTTP Serveur se ferme avec le message d'erreur
accept tcp [::]:8080: use of closed network connection
Aller 1.8 comprendra gracieuse et puissante de l'arrêt, disponible via
Server::Shutdown(context.Context)
etServer::Close()
respectivement.Le commit peut être trouvé ici
go func() { X() }()
suivie parY()
fait l'hypothèse erronée pour le lecteur queX()
exécutera avantY()
. Waitgroups etc. s'assurer que la synchronisation des bugs comme ce n'est pas vous mordre quand vous s'y attend le moins!Vous pouvez construire
net.Listener
que vous pouvez
Close()
et
http.Serve()
sur ellehttp.ListenAndServe
pour des raisons spécifiques. C'est la façon dont j'utilise GWT MUX de la bibliothèque, je ne suis pas sûr de la façon d'utiliser net.écouter pour que..Étant donné qu'aucune des réponses précédentes dire pourquoi vous ne pouvez pas le faire si vous utilisez le protocole http.ListenAndServe(), je suis allé dans la v1.8 http code source et voici ce qu'il dit:
Comme vous pouvez le voir le http.ListenAndServe fonction ne renvoie pas la variable serveur. Cela signifie que vous ne pouvez pas obtenir de "serveur" pour utiliser la commande Shutdown. Par conséquent, vous devez créer votre propre 'serveur' exemple au lieu d'utiliser cette fonction pour l'arrêt normal d'être mis en œuvre.
Vous pouvez fermer le serveur par la fermeture de son contexte.
Et à chaque fois que vous êtes prêt à fermer, composez le:
ctx
àserver.Shutdown
est incorrect. Le contexte est déjà annulés si ne sera pas mise à l'arrêt proprement. Vous pourriez avoir bien appeléserver.Close
pour impur de l'arrêt. (Pour un arrêt propre de ce code devra être largement retravaillé.comment les gars sur ce
Ce que j'ai fait pour de tels cas où l'application est tout le serveur et effectuer aucune autre fonction est d'installer un
http.HandleFunc
pour un modèle de type/shutdown
. Quelque chose commeIl ne nécessite pas de 1.8. Mais si la 1.8 est disponible, alors que la solution peut être incorporé ici à la place de la
os.Exit(0)
appel si cela est souhaitable, je crois.Le code pour effectuer tous que le travail de nettoyage est laissé comme exercice pour le lecteur.
Un crédit supplémentaire si vous pouvez dire que où que le code de nettoyage pourrait être plus raisonnable de même, je ne recommande pas de le faire ici, et comment ce point de terminaison frappé devrait provoquer l'invocation de ce code.
Plus d'un crédit supplémentaire si vous pouvez dire que où que
os.exit(0)
appel (ou quel que soit le processus de sortie vous choisissez d'utiliser), donnés ici à titre indicatif, serait la plus raisonnable, placé.Encore plus le crédit supplémentaire si vous pouvez expliquer pourquoi ce mécanisme de serveur HTTP processus de signalisation doivent être considérés au-dessus de tous les autres mécanismes de la pensée pratique dans ce cas.