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
Susan Sarandonoriginal
2024-12-17 21:06:15214parcourir

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")
}

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!

Déclaration:
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