gpt4 book ai didi

http - 带有错误处理的 Golang 优雅 HTTP 服务器关闭

转载 作者:IT王子 更新时间:2023-10-29 02:01:05 27 4
gpt4 key购买 nike

我正在让我的 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() 将保证完成?我需要对该线程进行某种阻塞,还是在主线程上创建一个它可以调用的 channel ?

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

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

4) 在调用 Server.ShutDown() 之后,我是否需要执行任何操作来关闭 http.HandleFunc() 监听器?

如果您能就这些主题中的任何一个提供任何帮助,我们将不胜感激,所以如果您不能一次触及所有内容,请不要担心 :)

编辑:如果有人想看看我是如何让这一切正常工作的,你可以看看this file。 ,第 225 行及以后。

最佳答案

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

因此,问题 1):您应该阻塞主例程以确保可以执行 serverError

还有 3) 个问题:您绝对应该自己阻塞 start()start() 之外,否则程序将立即退出。

至于2)。文档指出:

ListenAndServe always returns a non-nil error.

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

4) 无需关闭 http.HandleFunc(),因为 Server.ShutDown() 将等待正在处理的请求。

关于http - 带有错误处理的 Golang 优雅 HTTP 服务器关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com