9
votes

Comment traiter la requête HTTP parallèle en langage de programmation Go?

Je jouais avec le paquet HTTP Go. Je voulais traiter la demande parallèle comme je le fais à Java. Mais je ne pouvais pas.

J'ai créé un simple serveur Web, placez un sommeil au milieu et réalisé qu'il s'agissait d'une demande par temps, donc si je faisais un rafraîchissement sur mon navigateur, le processus de la première demande doit Terminer jusqu'à la deuxième demande de démarrage, voici le code: xxx

Comme je voulais traiter les deux demandes en parallèle, j'ai ajouté la commande "Go" avant "TRAGYREQUEST (C, REQ) "dans la fonction" Sayhello "afin de traiter chaque demande dans une gorutine différente. Mais ... ça ne marche pas ... Je ne sais pas pourquoi. Je sais que les deux demandes sont traitées car je vois la ligne imprimée à la console, mais le navigateur continue d'attendre des informations ..... et ne montre pas ma réponse.

Alors ... mes questions,

Chaque demande crée-t-elle une nouvelle http.Responsewriter? Ou il utilise la même chose? Savez-vous comment indiquer le serveur Web pour traiter chaque demande avec différents threads?

Toute aide est accueillie ...

FERSCA

go

0 commentaires

3 Réponses :


21
votes

Toutes les connexions sont automatiquement traitées simultanément. Chaque connexion TCP (non demande) obtient son propre goroutine.

Dans un monde avec pipelining HTTP et navigateurs qui réutilisent les connexions, cela ne fonctionne peut-être pas toujours bien. Très probablement, votre navigateur réutilise une connexion qui le stalle jusqu'à ce que la demande actuelle soit traitée par les finitions goroutine.


1 commentaires

Merci. Tant de temps gaspillé aujourd'hui juste à cause du comportement trop intelligent de navigateur :)



0
votes

Pour permettre au support d'exécution d'utiliser plusieurs threads d'OS, vous pouvez définir ce numéro via:

 runtime.GOMAXPROCS(runtime.NumCPU())


1 commentaires

Cela n'aide pas. Go est simultanément par défaut, juste pas multithreadé (il y a une grande différence entre les deux). Il va basculer vers une goroutine différente sur les appels de blocage tels que temps.sleep () et .write () .



0
votes

Je pense que votre navigateur attend parce que vous n'avez pas envoyé de réponse Votre navigateur a apporté une demande à Sayhello et à Sayhello a également demandé à ProcessRequest, De votre code ProcessRequest envoyé une réponse à Sayhello, mais Sayhello n'a pas renvoyé une réponse au navigateur.

Vous pouvez utiliser http.get ou http.post pour appeler processRequest


0 commentaires