Maison >développement back-end >Golang >Comment puis-je envoyer des données en temps réel avec des réponses HTTP sans tampon dans Go ?
Envoi de données en temps réel avec des réponses HTTP sans tampon dans Go
Dans Go, les réponses HTTP sont généralement mises en mémoire tampon avant d'être envoyées au client. Cependant, pour les applications de streaming ou en temps réel, il est crucial d'envoyer les données de manière incrémentielle sans mise en mémoire tampon.
Pour obtenir des réponses sans tampon, vous pouvez tirer parti de l'interface Flusher implémentée par certains ResponseWriter. En vidant la réponse après chaque opération d'écriture, vous pouvez envoyer les données directement au client dès qu'elles deviennent disponibles. Voici un exemple :
func handle(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "sending first line of data") if f, ok := res.(http.Flusher); ok { f.Flush() } sleep(10) // Not real code fmt.Fprintf(res, "sending second line of data") }
Bien que cette approche fonctionne pour les écritures manuelles, elle peut ne pas suffire pour canaliser la sortie des commandes ou d'autres scénarios dans lesquels les données arrivent de manière asynchrone. Dans de tels cas, vous pouvez utiliser une routine Go pour lire et vider les données en continu.
pipeReader, pipeWriter := io.Pipe() cmd.Stdout = pipeWriter cmd.Stderr = pipeWriter go writeCmdOutput(res, pipeReader) err := cmd.Run() pipeWriter.Close() func writeCmdOutput(res http.ResponseWriter, pipeReader *io.PipeReader) { buffer := make([]byte, BUF_LEN) for { n, err := pipeReader.Read(buffer) if err != nil { pipeReader.Close() break } data := buffer[0:n] res.Write(data) if f, ok := res.(http.Flusher); ok { f.Flush() } // Reset buffer for i := 0; i < n; i++ { buffer[i] = 0 } } }
Cette approche garantit que le résultat de la commande est écrit et vidé directement sur le client sans mise en mémoire tampon. Pour plus de commodité, envisagez d'utiliser une bibliothèque telle que [fasthttp](https://github.com/valyala/fasthttp) qui fournit une prise en charge intégrée du streaming en temps réel.
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!