优雅退出是否有点问题
xpzouying opened this issue · comments
zy commented
在 > internal/cli/app.go:L17 的函数中,
func startAction(ctx *cli.Context) error {
cfg, err := InitConfigAndComponents()
if err != nil {
cliLogger.Fatalf("InitConfigAndComponents meet err=%s", err.Error())
}
mainCtx, cancel := context.WithCancel(ctx.Context)
defer cancel()
exitSigs := make(chan os.Signal, 1)
signal.Notify(exitSigs, syscall.SIGINT, syscall.SIGTERM)
MustStartComponents(mainCtx, cfg)
// wait for exit
select {
case <-mainCtx.Done():
case <-exitSigs:
}
cliLogger.Infof("ehco exit now...")
return nil
}
这里实现了优雅退出的逻辑,但是感觉有点问题,思路如下,
通过下面代码劫持到退出信号后,比如:syscall.SIGINT,
select {
case <-mainCtx.Done():
case <-exitSigs:
}
此时会通过上面的 case <-exitSigs
分支退出,并且会结束掉当前 startAction
函数,
在退出时,会调用 cancel(),
此时,所有监听 <- mainCtx.Done()
会触发该信号,一般是用来关闭各种各样资源和退出。
但是此时会出现一种情况,就是释放资源较慢,这样就会导致 startAction() 结束或者整个进程结束后,仍然未完成资源的释放,所以就是否出现了:虽然做了优雅退出的逻辑处理,但是仍然未完美的做到“优雅退出”?
Ehco commented
的确是这样,可以考虑优化一下,收到退出信号时再等一下mainctx