ホームページ > バックエンド開発 > Golang > Go でバッファリングされていない HTTP 応答を使用してリアルタイム データを送信するにはどうすればよいですか?

Go でバッファリングされていない HTTP 応答を使用してリアルタイム データを送信するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-17 21:06:15
オリジナル
213 人が閲覧しました

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート