单独的goroutine中的HTTP服务器以显示进度

时间:2016-01-26 14:38:01

标签: http go goroutine

假设我在Go中有一个长期运行的程序正在服务器上运行,并且用户需要不时查看其结果(统计数据)。我们当然可以创建一个屏幕会话,让他通过SSH登录,重新连接到会话等,但它似乎不实用。 作为一个更好的选择,我想启动某种嵌入式HTTP服务器,它将监听某些端口,如8081,并且,无论何时请求,都以文本形式(或JSON或XML或其他)返回信息。 基本上它应该只是组成一个字符串并通过HTTP / 1.1返回它。 它显然应该在自己的goroutin中运行(在后台)。保证服务器接收少量流量(例如没有同时请求) 那么可能有一些可以随时使用的东西吗?

1 个答案:

答案 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)
}