Heim > Backend-Entwicklung > Golang > Wie kann ich Echtzeitdaten mit ungepufferten HTTP-Antworten in Go senden?

Wie kann ich Echtzeitdaten mit ungepufferten HTTP-Antworten in Go senden?

Susan Sarandon
Freigeben: 2024-12-17 21:06:15
Original
221 Leute haben es durchsucht

How Can I Send Real-Time Data with Unbuffered HTTP Responses in Go?

Senden von Echtzeitdaten mit ungepufferten HTTP-Antworten in Go

In Go werden HTTP-Antworten üblicherweise gepuffert, bevor sie an den Client gesendet werden. Für Streaming- oder Echtzeitanwendungen ist es jedoch entscheidend, Daten inkrementell ohne Pufferung zu senden.

Um ungepufferte Antworten zu erhalten, können Sie die von einigen ResponseWritern implementierte Flusher-Schnittstelle nutzen. Indem Sie die Antwort nach jedem Schreibvorgang leeren, können Sie Daten direkt an den Client senden, sobald diese verfügbar sind. Hier ist ein Beispiel:

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")
}
Nach dem Login kopieren

Während dieser Ansatz für manuelle Schreibvorgänge funktioniert, reicht er möglicherweise nicht für die Weiterleitung der Befehlsausgabe oder andere Szenarien aus, in denen Daten asynchron eingehen. In solchen Fällen können Sie eine Go-Routine verwenden, um die Daten kontinuierlich zu lesen und zu leeren.

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
    }
  }
}
Nach dem Login kopieren

Dieser Ansatz stellt sicher, dass die Befehlsausgabe ohne Pufferung direkt an den Client geschrieben und geleert wird. Erwägen Sie für noch mehr Komfort die Verwendung einer Bibliothek wie [fasthttp](https://github.com/valyala/fasthttp), die integrierte Unterstützung für Echtzeit-Streaming bietet.

Das obige ist der detaillierte Inhalt vonWie kann ich Echtzeitdaten mit ungepufferten HTTP-Antworten in Go senden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage