Heim > Backend-Entwicklung > Golang > Wie kann ich einen HTTP-Server nach der Rückgabe einer Antwort ordnungsgemäß herunterfahren?

Wie kann ich einen HTTP-Server nach der Rückgabe einer Antwort ordnungsgemäß herunterfahren?

Barbara Streisand
Freigeben: 2024-10-29 09:10:02
Original
1058 Leute haben es durchsucht

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

HTTP-Server nach Rückgabe der Antwort herunterfahren

Sie entwickeln einen Befehlszeilen-Bot, der mit der Instagram-API über OAuth interagiert, das nicht für die Befehlszeile optimiert ist Anwendungen. Um dies zu umgehen, haben Sie einen lokalen HTTP-Server als Umleitungs-URI für die Autorisierung eingerichtet. Nachdem der Benutzer die Anwendung autorisiert und zum Server weitergeleitet wurde, möchten Sie den Server herunterfahren, sobald das Zugriffstoken angezeigt wurde.

Bei der Implementierung des Shutdown-Mechanismus ist ein Problem aufgetreten. Insbesondere führt der Aufruf von srv.Shutdown(nil) im Anforderungshandler (showTokenToUser) zu einem Fehler:

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
Nach dem Login kopieren

Lösung

Das Problem entsteht, weil Sie srv.Shutdown(nil) aufrufen. mehrmals:

  1. Im showTokenToUser-Handler, wo es sich innerhalb eines Abschlusses befindet.
  2. Nachdem der Handler die Ausführung in der Hauptfunktion abgeschlossen hat.

Aufruf srv.Shutdown, während der Server noch auf Verbindungen wartet, führt zu einer Race-Bedingung. Die Goroutine ListenAndServe() versucht, die offenen Listener und inaktiven Verbindungen zu schließen, wird jedoch durch den nachfolgenden Aufruf von Shutdown im Handler-Schließen unterbrochen. Diese Zustandsinkonsistenz löst die Panik aus.

Um dieses Problem zu beheben, können Sie eine von zwei Methoden verwenden:

1. Verwenden Sie context.WithCancel:

Bei diesem Ansatz erstellen Sie einen context.Context mit einer Abbruchfunktion. Der Kontext wird an die Goroutine ListenAndServe und die Handlerfunktion showTokenToUser übergeben. Wenn dem Benutzer das Zugriffstoken angezeigt wurde, rufen Sie im Handler die Abbruchfunktion auf, um den Kontext zu beenden. Die ListenAndServe-Goroutine fährt den Server ordnungsgemäß herunter, wenn der Kontext abgebrochen wird.

2. Verwenden Sie denselben Kontext:

Anstatt context.WithCancel aufzurufen, können Sie denselben context.Context an die Goroutine ListenAndServe und die Handlerfunktion übergeben. Wenn das Zugriffstoken angezeigt wird, rufen Sie cancel() für den Kontext auf, was das Herunterfahren sowohl des Handlers als auch der ListenAndServe-Goroutine auslöst.

Denken Sie nach der Implementierung beider Ansätze daran, auf die Funktion srv.Shutdown zu warten Dies muss abgeschlossen werden, bevor das Programm beendet wird.

Das obige ist der detaillierte Inhalt vonWie kann ich einen HTTP-Server nach der Rückgabe einer Antwort ordnungsgemäß herunterfahren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage