2014-03-03 45 views
4

我正在构建一个需要启动自己的HTTP服务器的命令行应用程序。 我的想法是启动够程内的http服务器在我的主要程序是这样的:这是在golang中终止goroutine的正确方法吗?

func main() { 
    go myserver() 

    // perform lots of time-consuming tasks 
} 

func myserver() { 
    s := &http.Server{ 
     Addr: ":8080", 
     Handler: MyHandler{}, 
    } 
    log.Fatal(s.ListenAndServe()) 
} 
  1. 我的主要功能,需要能够告诉够程死亡。由于网络服务器在ListenAndServe方法上阻塞,因此无法通过sync.WaitGroup或通道发送信号。
  2. 我的一个想法是对Web服务器发出HTTP POST,并要求它在收到特定的商定价值后自杀。

是否还有其他替代方法对golang来说是惯用的?

回答

4

如果您在运行web界面直到程序退出,您可以从主线程返回。即使另一个goroutine正在工作,从主线程返回也会退出程序。如果您希望主线程向http服务器发送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)) 
} 

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

+0

我正在触发http客户端请求,他们都发送“连接:关闭”。谢谢。 – canadadry

相关问题