60 votes

Pourquoi mon serveur Web dans Golang ne gère-t-il pas les demandes simultanées?

Cette simple serveur HTTP qui contient un appel à la fois.Sleep() qui rend chaque demande de prendre cinq secondes. Quand j'ai essayer rapidement le chargement de plusieurs les onglets d'un navigateur, il est évident que chaque demande est mis en file d'attente et traitées de manière séquentielle. Comment puis-je faire gérer les demandes simultanées?

package main

import (
   "fmt"
   "net/http"
   "time"
)

func serve(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintln(w, "Hello, world.")
   time.Sleep(5 * time.Second)
}

func main() {
   http.HandleFunc("/", serve)
   http.ListenAndServe(":1234", nil) 
}

En fait, je viens de trouver la réponse à cette après la rédaction de la question, et il est très subtil. Je vous poste quand même, parce que je n'arrivais pas à trouver la réponse sur Google. Pouvez-vous voir ce que je fais de mal?

101voto

tux21b Points 17336

Votre programme déjà gère les demandes en même temps. Vous pouvez le tester avec ab, un outil de référence qui est livré avec Apache 2:

ab -c 500 -n 500 http://localhost:1234/

Sur mon système, l'indice de référence prend un total de 5043ms pour servir tous les 500 demandes simultanées. C'est juste votre navigateur qui limite le nombre de connexions par site.

Analyse comparative de programmes n'est pas facile, parce que vous devez vous assurer que votre outil de référence n'est pas le goulot d'étranglement et qu'il est également capable de gérer que de nombreuses connexions simultanées. Par conséquent, il est une bonne idée d'utiliser un couple de des ordinateurs dédiés à générer de la charge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X