【问题标题】:Web server graceful shutdown not working as expectedWeb 服务器正常关闭未按预期工作
【发布时间】:2019-10-28 09:27:14
【问题描述】:

我之前写过一篇关于在 Go 中通过优雅关闭创建网络服务器的博客。

https://marcofranssen.nl/go-webserver-with-gracefull-shutdown/#TLDR

此解决方案完美运行,但是对于更大的项目,我想进一步构建代码。

我已经按照以下要点重构了这段代码。

https://gist.github.com/marcofranssen/699c1aa97c8a33ab20b5eccada275b08

由于某种原因,srv.ListenAndServe() 的行似乎没有被执行,而优雅的关闭仍然像以前一样在 go 例程中运行。

对我来说,代码看起来相同,只是重构为单独的文件并添加了一个 Start 函数。

谁能解释一下为什么它直到我发出中断信号才执行,导致 http 服务器立即启动和关闭?

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、特定问题或错误以及重现它所需的最短代码 .

标签: go goroutine servemux


【解决方案1】:

我在社区的 Gopher 同伴的帮助下找到了答案。

包含srv.ListenAndServe() 的代码行是阻塞代码行,导致该代码行之后的日志不会发生。

在我之前的博客中演示的原始代码中,我将这个日志放在srv.ListenAndServe() 的前面。因此,在该示例中,相同的代码按预期记录到控制台。

所以毕竟这是一个愚蠢的错误,您可以轻松地阅读多次。基本上交换了两行代码,我忘记了http.ListenAndServe() 的阻塞行为。

要点:

http.ListenAndServe() 根据定义是阻塞的,因此不会在该行之后运行任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 2019-06-02
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2017-10-21
    • 2014-04-08
    • 2012-10-05
    相关资源
    最近更新 更多