服务启动的时候,好像处理的并不完善呢?
ctx, cancel := context.WithCancel(context.Background())
a.cancel = cancel
eg, ctx := errgroup.WithContext(ctx)
wg := sync.WaitGroup{}
for _, srv := range servers {
srv := srv
//2、再启动一个goroutine 去监听是否有err产生
eg.Go(func() error {
<-ctx.Done()
sctx, cancel := context.WithTimeout(context.Background(), a.opts.stopTimeout)
defer cancel()
return srv.Stop(sctx)
})
wg.Add(1)
//1、启动server
eg.Go(func() error {
wg.Done()
log.Info("start server")
return srv.Start(ctx)
})
}
wg.Wait()
老师这是项目的代码是不是有BUG?
你讲的时候有三种情况:
如果一个server启动失败剩余的的server状态:
- 还没开始start。解决方法:不进行start(直接stop)
- start进行中、解决方法:cancel start
- start已经完成。解决方法: 调用stop
对于 2 的情况,代码里并没有手动 处理 cancel 信号啊?!cancel信号只是促使执行Stop方法,正在执行一半的Start不是依旧会继续执行?
而对于 1 的情况,剩余的server还没执行Start方法,直接调用Stop,但是直接调用Stop也并没有终止Start方法啊?!
而且甚至对于 restServer 包里的server(Server wrapper for gin.Engine),这个server初始化的过程就在Start方法中,假设现在收到了cancel信号,直接调用的Stop方法,但是Stop方法中用到了server,此时若Start方法没执行完,连server都没初始化完成,不就panic了?
24
收起
正在回答 回答被采纳积分+1
2回答
相似问题
登录后可查看更多问答,登录/注册
Go开发工程师全新版
- 参与学习 490 人
- 解答问题 559 个
风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星