首页 文章

这是在golang中终止goroutine的正确方法吗?

提问于
浏览
5

我正在构建一个需要启动自己的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 或通道发送信号 .

  • 我的一个想法是向网络服务器发出HTTP POST,并要求它在收到特定的约定值时自杀 .

是否有其他替代方案是golang的惯用语?

1 回答

  • 5

    如果在程序退出之前运行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))
    }
    

    这不会关闭已经打开的连接 . 它只会阻止创建新的 . 您需要向处理程序添加逻辑和/或停止keep-alives以确保在您终止侦听器后很长时间不会重用连接 .

相关问题