En programmation Web, un serveur répond aux requêtes entrantes. Cependant, notre simple serveur Web est appelé à des heures paires apparemment aléatoires.
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.
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.
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.
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!