1

我正在让我的 HTTP 服务器正常关闭。我已经从这里的帖子中获取了提示,并且到目前为止已经设置了这样的代码:

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)我在上面链接的答案指出“注意:下一行有可能没有时间运行......”用于ListenAndServe()goroutine 内的错误处理。我怎样才能确保这serverError()将保证完成?我是否需要对该线程进行某种阻塞,或者我是否需要在它可以调用的主线程上创建一个通道?

2)截至目前,我不确定我是否有办法判断我是否有Server.ShutDown()http.Server或者它是否抛出错误并自行关闭。ListenAndServe()即使我使用该Server.ShutDown()方法也会引发错误吗?err != http.ErrServerClosed这就是为什么在检查ListenAndServe()错误时使用链接中接受的答案的原因吗?

3)start()函数(当然)在主线程上运行。我不需要以某种方式阻止该线程,这样程序就不会返回和退出,或者是否ListenAndServe()会为我处理这个问题?

4)打电话后Server.ShutDown()我需要做任何事情来关闭http.HandleFunc()听众吗?

非常感谢您对这些主题中的任何一个提供任何帮助,因此,如果您不能一次触及所有内容,请不要担心:)

编辑:如果有人想看看我最终是如何让这一切正常工作的,你可以查看这个文件,第 225 行等。

4

1 回答 1

2

main函数应该以某种方式等待您想要完全完成的所有 go 例程。

所以,1)问题:你应该阻止主程序以确保serverError可以执行。

和3)问题:绝对你应该自己阻止start()或阻止start(),否则程序将立即退出。

至于2)。医生指出:

ListenAndServe 总是返回一个非零错误。

所以err != http.ErrServerClosed只适用于情况Server.ShutDown()。然而,可能会出现其他错误。

4) 无需执行任何操作即可关闭,http.HandleFunc()因为Server.ShutDown()将等待处理完成的请求。

于 2018-12-24T00:19:30.857 回答