Maison >développement back-end >Golang >Pourquoi mon serveur Web semble-t-il être appelé un nombre pair de fois ?

Pourquoi mon serveur Web semble-t-il être appelé un nombre pair de fois ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-30 12:54:10927parcourir

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

Pourquoi un serveur Web est-il appelé nombre pair de fois ?

En programmation Web, un serveur répond aux requêtes entrantes. Cependant, notre simple serveur Web est appelé à des heures paires apparemment aléatoires.

Demandes sous le capot

Lors de l'actualisation de la page, vous pouvez observer ce qui suit :

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

Cela se produit parce que le navigateur effectue des requêtes supplémentaires en arrière-plan. Une requête courante concerne favicon.ico, une icône généralement affichée à côté du titre d'une page Web.

Réponse du serveur Web

Notre serveur Web ne gère pas la requête favicon.ico, ce qui entraîne il doit être demandé en permanence par le navigateur. Cette requête incrémente notre compteur, ce qui entraîne des appels pairs.

Synchronisation et contrôle

Go gère simultanément les requêtes à l'aide de goroutines. Cela peut conduire à une condition de concurrence critique dans notre code, où la variable d'appel est incrémentée par plusieurs goroutines simultanément. Pour éviter cela, nous synchronisons l'accès à la variable à l'aide d'opérations atomiques.

Alternativement, nous pouvons empêcher l'incrémentation du compteur pour chaque requête en vérifiant le chemin de la requête et en ignorant les requêtes non destinées à notre point de terminaison racine.

Code Fix

Pour garantir un comptage précis des appels, nous pouvons soit synchroniser l'accès à la variable des appels, soit ignorer sélectivement certaines requêtes, telles que 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)
}

En mettant en œuvre ces modifications, notre serveur Web comptera les appels avec précision, quelles que soient les requêtes supplémentaires du navigateur.

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!

Déclaration:
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