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

时间:2014-03-03 04:18:06

标签: go

我正在构建一个需要启动自己的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())
}
  1. 我的主要功能需要能够告诉goroutine死亡。由于网络服务器在ListenAndServe方法上受阻,因此无法通过sync.WaitGroup或频道发送信号。
  2. 我的一个想法是向网络服务器发出HTTP POST,并要求它在收到特定商定价值时自杀。
  3. golang还有其他替代方案吗?

1 个答案:

答案 0 :(得分:5)

如果您在程序退出之前运行Web界面,则可以从主线程返回。即使另一个goroutine正在工作,从主线程返回退出程序。如果您希望主线程向kill服务器发送kill,最好的方法是关闭监听器。

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

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