Go应用程序通过systemd优雅重启(无止境)

Go应用程序通过systemd优雅重启(无止境),go,systemd,Go,Systemd,我想为Go应用程序做真正优雅的重启,同时仍然能够用systemd控制它。我正在应用程序中使用。代码很简单(uncired.listendandserve(“:80”,nil)),对于systemd配置文件,到目前为止,我成功地将其设置为如下(goapp.service): 然后我用systemctl start goapp启动应用程序,一切都很好,但是当我发出systemctl restart goapp同时给应用程序大量请求时,restart命令似乎会挂起我的终端(而不是终止/分叉进程),直到

我想为Go应用程序做真正优雅的重启,同时仍然能够用systemd控制它。我正在应用程序中使用。代码很简单(
uncired.listendandserve(“:80”,nil)
),对于systemd配置文件,到目前为止,我成功地将其设置为如下(goapp.service):

然后我用
systemctl start goapp
启动应用程序,一切都很好,但是当我发出
systemctl restart goapp
同时给应用程序大量请求时,restart命令似乎会挂起我的终端(而不是终止/分叉进程),直到它没有请求为止。当然,当没有请求时,服务会成功重启

我正在使用以下简单代码进行测试:

package main   

import "net/http"
import "github.com/fvbock/endless"

func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello"))
}

func main() {
    http.HandleFunc("/", handler)
    endless.ListenAndServe(":80", nil)
}

有人能帮忙吗?我做错了什么?

我认为您需要包含所有应用程序代码,以便。。。如果你有goroutines,你的应用程序将不会正常重置,除非你有代码在应用程序想要关闭时强制所有goroutines返回。对不起,上面的评论有点不清楚。我不知道,因为这里没有包含您的实际源代码,但是根据我的经验,在所有活动goroutine返回之前,Go应用程序无法关闭/重新启动。我通过让我的所有异步函数接受一个中止通道来处理这个问题,并在一个通道选择中执行它们的所有工作,选择它们侦听中止的位置。如果您已启动goroutines,并且在发出重新启动命令时无法使其返回,则您将无法正常关闭。好的,我推测
ListenAndServe
无休止的
”实现正在泄漏goroutines,但我将查看其源代码。您能否澄清您想做什么,您希望systemctl restart实际终止并再次启动进程,还是希望它进行优雅的重新启动?@nos我希望它进行优雅的重新启动。我认为您需要包含所有应用程序代码才能实现这一点。。。如果你有goroutines,你的应用程序将不会正常重置,除非你有代码在应用程序想要关闭时强制所有goroutines返回。对不起,上面的评论有点不清楚。我不知道,因为这里没有包含您的实际源代码,但是根据我的经验,在所有活动goroutine返回之前,Go应用程序无法关闭/重新启动。我通过让我的所有异步函数接受一个中止通道来处理这个问题,并在一个通道选择中执行它们的所有工作,选择它们侦听中止的位置。如果您已启动goroutines,并且在发出重新启动命令时无法使其返回,则您将无法正常关闭。好的,我推测
ListenAndServe
无休止的
”实现正在泄漏goroutines,但我将查看其源代码。您能否澄清您想做什么,您希望systemctl restart实际终止并再次启动该进程,还是希望它进行优雅的重新启动?@nos我希望它进行优雅的重新启动。
package main   

import "net/http"
import "github.com/fvbock/endless"

func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello"))
}

func main() {
    http.HandleFunc("/", handler)
    endless.ListenAndServe(":80", nil)
}