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 中国語 Web サイトの他の関連記事を参照してください。