猿问

在什么情况下 http.ListenAndServe 会返回

我看到很多代码都在做这种事情:

log.Fatal(http.ListenAndServe(":8080",nil))

我从未见过 http 服务器返回错误,但我想更多地了解我可能遇到的故障类型的可能性。

如果我的处理程序代码恐慌,它会停止吗?它只会在最初无法绑定的情况下返回吗?

确保服务器尽可能保持活动状态的最佳做法是什么?


哆啦的时光机
浏览 369回答 2
2回答

守着一只汪

如果我的处理程序代码恐慌,它会停止吗?不会。内置的 http 服务器可以从恐慌中恢复并记录它们。它只会在最初无法绑定的情况下返回吗?这是通常的原因,尽管其他一些错误可能会迫使侦听器关闭。确保服务器尽可能保持活动状态的最佳做法是什么?如果 http 服务器的主循环退出,则可能是您不想尝试并从中恢复的致命错误。如果在尝试绑定地址时该调用返回,您可以检查address in use错误,然后等待并重试。// Example to show the error types and fields on a *nix system.// You should check the validity of these assertions if you don't want to // panic. Due to the fact that this reaches into syscall, it's probably // not much better than checking the string for "address already in use"if err.(*net.OpError).Err.(*os.SyscallError).Err == syscall.EADDRINUSE {    fmt.Println("Address in use")}请记住,ListenAndServe 实际上是 2 个调用,您可以自己将它们分开。它创建 a net.Listener,然后将其提供给 anhttp.Server的Serve(l net.Listener)方法。

明月笑刀无情

这可能是值得指出的是,去包文档的log.Fatal说Fatal 等价于 Print() 然后调用 os.Exit(1)。此外,该文件的http.ListenAndServe解释此函数将阻塞,直到程序终止。因此,log.Fatal只有在 http 侦听器因某种原因被杀死时才会进行调用。正如上面的答案所说,将处理恐慌。该http.ListenAndServe函数应该无限期地继续,直到底层套接字连接中断。此时log.Fatal将打印侦听器返回的任何消息,然后调用程序以完全退出并显示错误代码 (1)。因此,让侦听器保持活动状态的“最佳实践”是做任何使套接字连接保持活动状态的事情。在那个阶段,它更有可能是网络方面的考虑。
随时随地看视频慕课网APP

相关分类

Go
我要回答