Diese Anleitung befasst sich mit dem Problem der Pufferung bei der HTTP-Antwortverarbeitung in Go, bei der Antworten normalerweise gepuffert und in Blöcken gesendet werden Der Kunde wird nach der Bearbeitung der Anfrage benachrichtigt. Für Streaming-Szenarien ist dies möglicherweise nicht wünschenswert.
Der bereitgestellte Codeausschnitt veranschaulicht das Problem, bei dem zwei Datenzeilen gestreamt werden sollen, aber aufgrund der Pufferung stattdessen gleichzeitig gesendet werden.
Ein Ansatz zur Behebung dieses Problems besteht darin, den Antwortpuffer explizit zu leeren. Der ResponseWriter von Go stellt eine Flush-Methode bereit, deren Verfügbarkeit jedoch von der spezifischen Implementierung abhängt.
Als Beispiel beinhaltet der folgende geänderte Code das Flushing:
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") }
In bestimmten Szenarien, wie zum Beispiel beim Streamen der Ausgabe eines externen Befehls, reicht das direkte Leeren möglicherweise nicht aus. Der Pipe-Mechanismus von Go ermöglicht ein direktes Streaming zwischen der Ausgabe des Befehls und dem Antwortschreiber.
Hier ist eine Beispielimplementierung:
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 } } }
Für mehr Flexibilität ist es möglich, den TCP-Hijacker zu verwenden, der eine direkte Kontrolle über die TCP-Verbindung gewährt. Dieser Ansatz erfordert jedoch ein tieferes Verständnis der Netzwerkprogrammierung und wird für allgemeine Anwendungsfälle weniger empfohlen.
Beachten Sie, dass es dennoch zu Pufferungen in Netzwerkkomponenten oder innerhalb der Client-Anwendung kommen kann Es ist von entscheidender Bedeutung, Ihren spezifischen Anwendungsfall zu bewerten, um festzustellen, ob eine explizite Spülung oder alternative Lösungen erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie kann ich HTTP-Antworten in Golang streamen und Standardpufferung vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!