【发布时间】:2019-05-23 07:04:15
【问题描述】:
我正在让我的 HTTP 服务器正常关闭。我从here 帖子中获得了提示,并且到目前为止我的代码设置如下:
func start() {
//......
//START HTTP/SOCKET LISTENER
if settings.TLS {
httpServer = makeServer("/wss", settings.TLS);
} else {
httpServer = makeServer("/ws", settings.TLS);
}
//...
}
func makeServer(handleDir string, tls bool) (*http.Server) {
server := &http.Server{Addr: settings.IP+":"+strconv.Itoa(settings.Port)}
http.HandleFunc(handleDir, socketInitializer)
if tls {
go func() {
err := server.ListenAndServeTLS(settings.CertFile, settings.PrivKeyFile)
if err != nil {
serverError(err)
}
}()
}else{
go func() {
err := server.ListenAndServe()
if err != nil {
serverError(err)
}
}()
}
//
return server
}
所以,我对这一切现在如何运作有一些疑问:
1) 我在上面链接的答案指出“注意:下一行有可能没有时间运行......”用于 goroutine 内的 ListenAndServe() 错误处理。我如何确保serverError() 保证完成?我需要对该线程进行某种阻塞,还是在主线程上创建一个可以调用的通道?
2) 到目前为止,我不确定我是否有办法判断我是否有 Server.ShutDown() 和 http.Server,或者它是否抛出错误并自行关闭。即使我使用了Server.ShutDown() 方法,是否会抛出ListenAndServe() 错误?这就是为什么链接中接受的答案在检查ListenAndServe() 错误时使用err != http.ErrServerClosed 的原因吗?
3) start() 函数(当然)在主线程上运行。我不需要以某种方式阻止该线程以使程序不会返回和退出,还是 ListenAndServe() 会为我处理这些?
4) 在我打电话给Server.ShutDown() 之后,我需要做些什么来关闭http.HandleFunc() 的监听器吗?
我们将不胜感激任何关于这些主题的帮助,所以如果您不能同时涉及所有内容,请不要担心 :)
编辑:如果有人想看看我最终是如何让这一切正常工作的,您可以查看this file,第 225 行等。
【问题讨论】:
-
我看了看,但对于到底发生了什么,仍然有所有这些悬而未决的问题。我现在一切正常:)
标签: http go go-graceful