假设我在Go中有一个长期运行的程序正在服务器上运行,并且用户需要不时查看其结果(统计数据)。我们当然可以创建一个屏幕会话,让他通过SSH登录,重新连接到会话等,但它似乎不实用。 作为一个更好的选择,我想启动某种嵌入式HTTP服务器,它将监听某些端口,如8081,并且,无论何时请求,都以文本形式(或JSON或XML或其他)返回信息。 基本上它应该只是组成一个字符串并通过HTTP / 1.1返回它。 它显然应该在自己的goroutin中运行(在后台)。保证服务器接收少量流量(例如没有同时请求) 那么可能有一些可以随时使用的东西吗?
答案 0 :(得分:0)
这需要与您长期运行的程序进行一些合作编程来监听请求。它也是chan chan
// inside your main package
// MakeResponse listens for a request for information and serves it back on
// request's channel.
func MakeResponse(request chan chan interface{}) {
// I'm not sure what kind of raw data you're trying to throw back, but
// you probably don't want to do your encoding to json here. Do that in
// your webserver instead.
for resp := range request {
resp <- getInternalStateInformation()
}
}
// inside your listener package
var requests chan chan interface{}
func init() {
requests = make(chan chan interface{}, 10)
}
func RequestInfo(w http.ResponseWriter, r *http.Request) {
response := make(chan interface{})
requests<-response
data := <-response
outData, err := json.Marshal(data)
if err != nil {
log.Printf("Couldn't marshal data %v\n", data)
}
fmt.Fprint(w, outData) // or more likely execute a template with this
// context
}
func main() {
defer close(requests)
go longrunningprog.MakeResponse(requests)
http.HandleFunc("/", RequestInfo)
http.ListenAndServe(":8081", nil)
}