在Go 中使用未緩衝的HTTP 回應傳送即時資料
在Go 中,HTTP 回應通常在傳送到客戶端之前進行緩衝。然而,對於串流或即時應用程序,在不緩衝的情況下增量發送資料至關重要。
要實現無緩衝響應,您可以利用某些 ResponseWriter 實作的 Flusher 介面。透過在每次寫入作業後刷新回應,您可以在資料可用時將資料直接傳送到用戶端。這是一個範例:
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") }
雖然此方法適用於手動寫入,但它可能不足以滿足管道命令輸出或資料非同步傳入的其他場景。在這種情況下,您可以利用 Go 例程連續讀取和刷新資料。
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 } } }
這種方法可確保命令輸出直接寫入並刷新到客戶端,而無需緩衝。為了進一步方便,請考慮使用像 [fasthttp](https://github.com/valyala/fasthttp) 這樣的函式庫,它為即時串流提供內建支援。
以上是如何在 Go 中發送帶有無緩衝 HTTP 回應的即時資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!