【问题标题】:Go realtime application heavy writes on ResponseWriter在 ResponseWriter 上进行实时应用程序大量写入
【发布时间】:2015-12-24 07:51:30
【问题描述】:

我有一个 Web 应用程序需要不断写入(可能永远不会结束)到http.ResponseWriter,并将这些输出显示到 html 页面。是这样的:

func handler(w http.ResponseWriter, req *http.Request) {
     switch req.Method {
         case "GET":
              for {
                  fmt.Fprintln(w, "repeating...")
              }
     }
}

我觉得 HTML 输出跟不上速度。

如果我想继续在http.ResponseWriter 上写作并尽可能快地在 HTML 上实时显示,那么实现这一目标的最佳方法是什么?

谢谢,

【问题讨论】:

  • 这可以通过websocket 或 GOA(Good ol' AJAX)来实现。无论哪种方式,您只需将新数据附加到旧数据。
  • stream 可以通过 http,但是浏览器的 js 无法处理 http 部分接收到的响应,所以 websocket 或者一次又一次地发出 http 请求。

标签: web-applications go websocket webserver real-time


【解决方案1】:

默认http.ResponseWriter 使用bufio.ReadWriter 作为底层连接,它缓冲所有写入。如果您希望尽可能快地发送数据,则必须在每次写入后刷新缓冲区。

net/http 包中有一个http.Flusher 接口,默认实现http.ResponseWriter

有了这个你可以重写你的例子如下:

func handler(w http.ResponseWriter, req *http.Request) {
     switch req.Method {
     case "GET":
          for {
              fmt.Fprintln(w, "repeating...")

              if f, ok := w.(http.Flusher); ok {
                  f.Flush()
              }
          }
     }
}

这将在每次写入后刷新内部缓冲区。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多