我正在构建一个命令行应用程序,需要启动其自己的HTTP服务器。
我的想法是在我的主程序中的goroutine中启动http服务器,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 | func main() { go myserver() // perform lots of time-consuming tasks } func myserver() { s := &http.Server{ Addr:":8080", Handler: MyHandler{}, } log.Fatal(s.ListenAndServe()) } |
还有其他golang惯用的替代方法吗?
如果在程序退出之前一直在运行Web界面,则只需从主线程返回即可。 即使另一个goroutine正在工作,从主线程返回也将退出程序。 如果希望主线程将kill发送给http服务器,则最好的方法是关闭侦听器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | func main() { l, err := net.Listen("tcp",":8080") if err != nil { log.Fatal(err) } go myserver(l) // perform lots of time-consuming tasks l.Close() } func myserver(l net.Listener) { s := &http.Server{ Addr: ":8080", Handler: MyHandler{}, } log.Print(s.Serve(l)) } |
这不会关闭已经打开的连接。 这只会阻止创建新的。 您需要向处理程序中添加逻辑和/或停止保持活动状态,以确保在终止侦听器后很长时间不重用该连接。
- 我也触发了HTTP客户端请求,并且它们都发送" Connection:close"。 谢谢。