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 ?

Comment puis-je envoyer des données en temps réel avec des réponses HTTP sans tampon dans Go ?

Susan Sarandon
Libérer: 2024-12-17 21:06:15
original
213 Les gens l'ont consulté

How Can I Send Real-Time Data with Unbuffered HTTP Responses in 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")
}
Copier après la connexion

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

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!

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