gpt4 book ai didi

go - Gin 服务器的优雅停止

转载 作者:行者123 更新时间:2023-12-03 10:10:39 30 4
gpt4 key购买 nike

我正在尝试使用一种干净的方法,使用传递给我的类的父上下文来优雅地停止我的gin服务器。
这是我当前的代码
有没有更清洁的方法可以做到这一点?感觉像很多样板代码和不必要的例如使用无限循环完成如此简单的任务。

func (instance *MyListener) Listen(ctx context.Context) error {
ctx, cancel := context.WithCancel(ctx)
defer cancel()

engine := gin.Default()
engine.POST("/doStuff", func(c *gin.Context) {
instance.doStuff()
c.Status(200)
})

instance.httpSrv = &http.Server {
Addr: ":8080",
Handler: engine,
}

// Initializing the server in a goroutine so that
// it won't block the graceful shutdown handling below
go func() {
if err := instance.httpSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logging.Log.Error("Could not start listener", zap.Error(err))
}
}()

loop:
for {
select {
case <- ctx.Done():
break loop
default:
time.Sleep(1000)
}
}

ctx, cancel = context.WithTimeout(ctx, 2 * time.Second)
if err := instance.httpSrv.Shutdown(ctx); err != nil {
logging.Log.Error("Server forced to shutdown:", err)
}

return nil
}

最佳答案

这:

loop:
for {
select {
case <- ctx.Done():
break loop
default:
time.Sleep(1000)
}
}
可以替换为:
<- ctx.Done()
这样既有效又高效。除此之外,您所拥有的解决方案似乎是干净,清晰和正确的。

关于go - Gin 服务器的优雅停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65686384/

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