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