Heim >Backend-Entwicklung >Golang >Warum scheint mein Webserver gerade oft aufgerufen zu werden?

Warum scheint mein Webserver gerade oft aufgerufen zu werden?

Susan Sarandon
Susan SarandonOriginal
2024-12-30 12:54:10948Durchsuche

Why Does My Web Server Seem to Be Called an Even Number of Times?

Warum wird ein Webserver „Even Number Times“ genannt?

Bei der Webprogrammierung antwortet ein Server auf eingehende Anfragen. Unser einfacher Webserver wird jedoch scheinbar zufällig in geraden Zahlen aufgerufen.

Anfragen unter der Haube

Beim Aktualisieren der Seite bemerken Sie möglicherweise Folgendes:

You've called me 1 times
You've called me 3 times
You've called me 5 times
....

Dies geschieht, weil der Browser im Hintergrund zusätzliche Anfragen stellt. Eine häufige Anfrage betrifft favicon.ico, ein Symbol, das normalerweise neben dem Titel einer Webseite angezeigt wird.

Antwort des Webservers

Unser Webserver verarbeitet die favicon.ico-Anfrage nicht Es muss ständig vom Browser angefordert werden. Diese Anfrage erhöht unseren Zähler, was zu geraden Anrufen führt.

Synchronisierung und Kontrolle

Go verarbeitet Anfragen gleichzeitig mithilfe von Goroutinen. Dies kann zu einer Race-Bedingung in unserem Code führen, bei der die Variable „calls“ von mehreren Goroutinen gleichzeitig erhöht wird. Um dies zu verhindern, synchronisieren wir den Zugriff auf die Variable mithilfe atomarer Operationen.

Alternativ können wir verhindern, dass der Zähler bei jeder Anfrage erhöht wird, indem wir den Anfragepfad überprüfen und Anfragen ignorieren, die nicht für unseren Root-Endpunkt bestimmt sind.

Code-Korrektur

Um eine genaue Anrufzählung zu gewährleisten, können wir entweder den Zugriff auf die Anrufvariable synchronisieren oder bestimmte Anfragen selektiv ignorieren, z favicon.ico:

// Use atomic operations
func HelloWorld(w http.ResponseWriter, r *http.Request) {
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}

// Ignore specific requests
func HelloWorld(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" || r.URL.Path == "/favicon.ico" {
        return
    }
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}

Durch die Implementierung dieser Änderungen zählt unser Webserver Anrufe unabhängig von zusätzlichen Browseranfragen genau.

Das obige ist der detaillierte Inhalt vonWarum scheint mein Webserver gerade oft aufgerufen zu werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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