【发布时间】:2017-11-24 09:42:52
【问题描述】:
我正在创建一个类似于 Twitter firehose/streaming API 的流式 API。
据我所知,这是基于保持打开状态的 HTTP 连接,当后端获取数据时,它会写入被卡住的 HTTP 连接。似乎我编写的任何代码都会在任何连接后立即关闭 HTTP 连接。
有没有办法让它保持打开状态?
func startHTTP(pathPrefix string) {
log.Println("Starting HTTPS Server")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// Wait here until a write happens to w
// Or we timeout, we can reset this timeout after each write
})
log.Print("HTTPS listening on :5556")
log.Fatal(http.ListenAndServeTLS(":5556", pathPrefix+".crt", pathPrefix+".key", nil))
}
【问题讨论】:
-
如果您不想关闭连接,请不要从处理程序返回。处理程序是“处理”连接的对象。
-
对,所以它到达函数的末尾并返回并关闭连接。 “阻塞”函数并能够从另一个 goroutine 写入 w 的最佳方法是什么?
-
您可以尝试将其放入具有 select 语句的无限 for 循环中,这样您就可以捕获发生的任何错误以关闭任何错误的连接
-
在任何函数中阻止的方式相同。您需要与其他 goroutine 协调,将 ResponseWriter 传递给它,然后等待它完成。如果你有为此运行的 goroutine,你必须已经有某种模式来调度和等待它们。
-
是的,每个连接处理程序都在它自己的 goroutine 中; goroutines 是 Go 处理并发的方式。
标签: go