我正在构建一个需要启动自己的HTTP服务器的命令行应用程序.我的想法是在我的主程序中的goroutine中启动http服务器,如下所示:
func main() {
go myserver()
// perform lots of time-consuming tasks
}
func myserver() {
s := &http.Server{
Addr: ":8080",
Handler: MyHandler{},
}
log.Fatal(s.ListenAndServe())
}
Run Code Online (Sandbox Code Playgroud)
ListenAndServe方法,因此无法通过sync.WaitGroup信道或信道发送信号.是否有其他替代方案是golang的惯用语?
如果在程序退出之前运行Web界面,则可以从主线程返回.即使另一个goroutine正在工作,从主线程返回退出程序.如果您希望主线程将kill发送到http服务器,最好的方法是关闭侦听器.
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))
}
Run Code Online (Sandbox Code Playgroud)
这不会关闭已经打开的连接.它只会阻止创建新的.您需要向处理程序添加逻辑和/或停止keep-alives以确保在您终止侦听器后很长时间不会重用连接.