我正在构建一个命令行应用程序,需要启动其自己的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())
}
  • 我的主要功能需要能够告诉goroutine死掉。 由于Web服务器正在阻止ListenAndServe方法,因此无法通过sync.WaitGroup或通道发出信号。
  • 我的一个想法是对Web服务器进行HTTP POST,并要求其在收到特定的商定值时自杀。
  • 还有其他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"。 谢谢。