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
Libérer: 2024-12-30 12:54:10
original
925 Les gens l'ont consulté

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
....
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal