这是在golang中终止goroutine的正确方法吗?
发布时间:2020-12-16 09:26:00 所属栏目:大数据 来源:网络整理
导读:我正在构建一个需要启动自己的HTTP服务器的命令行应用程序. 我的想法是在我的主程序中的goroutine中启动http服务器,如下所示: func main() { go myserver() // perform lots of time-consuming tasks}func myserver() { s := http.Server{ Addr: ":8080",Ha
我正在构建一个需要启动自己的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()) } >我的主要功能需要能够告诉goroutine死亡.由于Web服务器在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",} log.Print(s.Serve(l)) } 这不会关闭已经打开的连接.它只会阻止创建新的.您需要向处理程序添加逻辑和/或停止keep-alives以确保在您终止侦听器后很长时间不会重用连接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |