php-Editor Xigua stellt Ihnen in diesem Artikel das normale Herunterfahren von Workern und HTTP-Servern vor. Während des Entwicklungsprozesses ist es sehr wichtig, den Worker und den HTTP-Server ordnungsgemäß herunterzufahren, um die Freigabe von Ressourcen und den normalen Beenden des Programms sicherzustellen. In diesem Artikel wird ausführlich erläutert, wie Worker und HTTP-Server ordnungsgemäß heruntergefahren werden, sowie einige häufig auftretende Probleme und Lösungen. Lassen Sie uns gemeinsam lernen, wie wir das normale Herunterfahren des Servers sicherstellen und die Stabilität und Zuverlässigkeit der Anwendung verbessern können.
Frageninhalt
Ich versuche, einen Arbeitsprozess und einen HTTP-Server zu erstellen, die unabhängig voneinander gestartet werden und auf Beendigung warten und nach Abschluss ordnungsgemäß beendet werden.
Aus irgendeinem Grund startet der Arbeitsthread, aber der http-Server startet erst, wenn das Sigterm-Ereignis gesendet wird. Der http-Server startet erst nach dem Senden des Sigterm-Ereignisses. Was ist das Problem unten?
Ausgabe
https://gosamples.dev is the best https://gosamples.dev is the best https://gosamples.dev is the best ^c2023/05/27 15:07:52 listening on http server port: process finished with the exit code 0
Code
package main import ( "context" "fmt" "log" "net/http" "os" "os/signal" "sync" "syscall" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { signals := make(chan os.Signal, 1) signal.Notify(signals, os.Interrupt, syscall.SIGTERM) <-signals cancel() }() var wg sync.WaitGroup wg.Add(1) go func() { if err := myWorker(ctx); err != nil { cancel() } wg.Done() }() wg.Add(1) go func() { if err := startServer(ctx); err != nil { cancel() } wg.Done() }() wg.Wait() } func myWorker(ctx context.Context) error { shouldStop := false go func() { <-ctx.Done() shouldStop = true }() for !shouldStop { fmt.Println("https://gosamples.dev is the best") time.Sleep(1 * time.Second) } return nil } func startServer(ctx context.Context) error { var srv http.Server go func() { <-ctx.Done() // Wait for the context to be done // Shutdown the server if err := srv.Shutdown(context.Background()); err != nil { // Error from closing listeners, or context timeout: log.Printf("HTTP server Shutdown: %v", err) } }() if err := srv.ListenAndServe(); err != http.ErrServerClosed { // Error starting or closing listener: return fmt.Errorf("HTTP server ListenAndServe: %w", err) } log.Printf("Listening on HTTP server port: %s", srv.Addr) http.HandleFunc("/readiness", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }) http.HandleFunc("/liveness", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }) return nil }
Workaround
Wenn ich Ihren Code richtig gelesen habe, starten Sie den Server, bevor Sie den Routenhandler definieren. Das bedeutet, dass der Server beim Starten nichts über Ihre /readiness
和 /liveness
Endpunkte weiß, da Sie diese noch nicht hinzugefügt haben. Infolgedessen wird der Server gestartet, führt jedoch keine Aktion aus, da keine Routen verarbeitet werden müssen.
Dann sind Sie nicht dabei http.server
实例中定义 addr
字段。 listenandserve()
使用调用它的 http.server
实例的 addr
字段中定义的地址。如果为空,则默认为 ":http"
, aber dies ist in Ihrem Code nicht explizit angegeben und kann zu Verwirrung führen.
Ich bin srv.listenandserve
ganz ans Ende des Startservers verschoben. Was habe ich verpasst?
Das Problem besteht nicht darin, wo srv.listenandserve
在函数中的位置,而在于如何配置 http.server
in der Funktion steht, sondern darin, wie http.server
konfiguriert ist und wann der http-Handler eingestellt ist.
Im Originalcode legen Sie den http-Handler fest, nachdem der Server gestartet wurde. Die Handler müssen vor dem Starten des Servers festgelegt werden, da der Server, sobald er ausgeführt wird, keine später definierten neuen Handler mehr aufnimmt.
Und nach der Protokollanweisung log.printf("listening on http server port: %s", srv.addr)
位于srv.listenandserve()
handelt es sich um einen blockierenden Aufruf. Dies bedeutet, dass die Protokollanweisung erst ausgeführt wird, nachdem der Server gestoppt wurde, weshalb Sie sie erst nach dem Senden des Sigterm-Signals sehen können.
Versuchen Sie, Ihre startserver
Funktion wie folgt neu zu organisieren:
func startServer(ctx context.Context) error { srv := &http.Server{ Addr: ":8080", // Define the address where you want the server to listen } http.HandleFunc("/readiness", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }) http.HandleFunc("/liveness", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }) go func() { <-ctx.Done() // Wait for the context to be done // Shutdown the server if err := srv.Shutdown(context.Background()); err != nil { // Error from closing listeners, or context timeout: log.Printf("HTTP server Shutdown: %v", err) } }() log.Printf("Listening on HTTP server port: %s", srv.Addr) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { // Error starting or closing listener: return fmt.Errorf("HTTP server ListenAndServe: %w", err) } return nil }
In der modifizierten Version der startserver
函数的修改版本中,服务器现在知道您的 /readiness
和 /liveness
-Funktion kennt der Server jetzt Ihre
-Endpunkte, da diese vor dem Serverstart definiert wurden. addr
HTTP-Handler werden vor dem Serverstart festgelegt und Protokollanweisungen werden vor dem Serverstart gedruckt. Dies sollte Ihr Problem lösen und es dem Server ermöglichen, Anfragen wie erwartet zu starten und zu verarbeiten. Außerdem weiß der Server jetzt, wo er zuhören muss, da
Das obige ist der detaillierte Inhalt vonWorker und HTTP-Server wurden ordnungsgemäß heruntergefahren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Dieser Artikel erläutert die Paketimportmechanismen von Go: benannte Importe (z. B. importieren & quot; fmt & quot;) und leere Importe (z. B. Import _ & quot; fmt & quot;). Benannte Importe machen Paketinhalte zugänglich, während leere Importe nur T ausführen

In diesem Artikel werden die Newflash () -Funktion von BeEGO für die Übertragung zwischen PAGE in Webanwendungen erläutert. Es konzentriert sich auf die Verwendung von Newflash (), um temporäre Nachrichten (Erfolg, Fehler, Warnung) zwischen den Controllern anzuzeigen und den Sitzungsmechanismus zu nutzen. Limita

Dieser Artikel beschreibt die effiziente Konvertierung von MySQL -Abfrageergebnissen in GO -Strukturscheiben. Es wird unter Verwendung der SCAN -Methode von Datenbank/SQL zur optimalen Leistung hervorgehoben, wobei die manuelle Parsen vermieden wird. Best Practices für die Struktur -Feldzuordnung mithilfe von DB -Tags und Robus

Dieser Artikel zeigt, dass Mocks und Stubs in GO für Unit -Tests erstellen. Es betont die Verwendung von Schnittstellen, liefert Beispiele für Mock -Implementierungen und diskutiert Best Practices wie die Fokussierung von Mocks und die Verwendung von Assertion -Bibliotheken. Die Articl

In diesem Artikel werden die benutzerdefinierten Typ -Einschränkungen von GO für Generika untersucht. Es wird beschrieben, wie Schnittstellen die minimalen Typanforderungen für generische Funktionen definieren und die Sicherheitstypsicherheit und die Wiederverwendbarkeit von Code verbessern. Der Artikel erörtert auch Einschränkungen und Best Practices

Dieser Artikel beschreibt effizientes Dateischreiben in Go und vergleicht OS.WriteFile (geeignet für kleine Dateien) mit OS.openfile und gepufferter Schreibvorgänge (optimal für große Dateien). Es betont eine robuste Fehlerbehandlung, die Verwendung von Aufschub und Überprüfung auf bestimmte Fehler.

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

In diesem Artikel wird die Verwendung von Tracing -Tools zur Analyse von GO -Anwendungsausführungsfluss untersucht. Es werden manuelle und automatische Instrumentierungstechniken, den Vergleich von Tools wie Jaeger, Zipkin und Opentelemetrie erörtert und die effektive Datenvisualisierung hervorheben


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Sicherer Prüfungsbrowser
Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

EditPlus chinesische Crack-Version
Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

SublimeText3 Linux neue Version
SublimeText3 Linux neueste Version
