当前位置: 首页 > news >正文

查看网站的注册时间百度快照收录入口

查看网站的注册时间,百度快照收录入口,杭州手机网站建设,网站恶意点击棋牌游戏项目ctrl c无法退出进程问题 运行的服务为 user , 启动命令为 cd user && go run main.go启动之前先加入调试语句 在 go func() { metric.Serve(...) } 打日志在 app.Run(...) 打日志 user/main.go var configFile flag.String("config", "…

棋牌游戏项目ctrl + c无法退出进程问题

  • 运行的服务为 user , 启动命令为
cd user && go run main.go
  • 启动之前先加入调试语句
    • go func() { metric.Serve(...) } 打日志
    • app.Run(...) 打日志
  • user/main.go
var configFile = flag.String("config", "application.yaml", "config file")func main() {flag.Parse()config.InitConfig(configFile)log.Println("metric serve")go func() {metric.Serve(fmt.Sprintf("0.0.0.0:%d", config.Conf.MetricPort))}()log.Println("start app")err := app.Run(context.Background())if err != nil {panic("run app error\n")}// 不让进程停止select {}
}
  • 启动之后的终端输出如下
    在这里插入图片描述
  • 但是当输入 ctrl + c 时,退出失败
    • 程序会输出 user/app.go 的调试日志信息
      在这里插入图片描述
  • 调试信息来自 user/app.go , 来看看里面的逻辑
func Run(ctx context.Context) error {// start GRPC serverserver := grpc.NewServer()// 直接go func() {listen, err := net.Listen("tcp", config.Conf.Grpc.Addr)if err != nil {log.Fatalf("Failed to listen on %s: %v", config.Conf.Grpc.Addr, err)}// 因为Serve这里就是阻塞操作,如果不用协程,这里就会一直被阻塞, 下面的信号就无法监听了if err := server.Serve(listen); err != nil {log.Fatalf("Failed to serve: %v", err)}}()c := make(chan os.Signal, 1)signal.Notify(c,// 终止信号syscall.SIGTERM,// 退出信号syscall.SIGQUIT,// 中断信号syscall.SIGINT,// 挂断信号syscall.SIGHUP,)stop := func() {server.Stop()fmt.Println("stop app finish")}// 优雅启动停止for {select {case <-ctx.Done():return nilcase sig := <-c:switch sig {case syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT:stop()log.Println("user app quit")return nilcase syscall.SIGHUP:stop()log.Println("hang up user app quit")return nildefault:return nil}}}
}
  • 该函数在 main.go 中以 app.Run(context.Background()) 的方式调用
    • 里面会起协程 go func() { net.Listen(...) } 并且以 for { select {} } 的方式阻塞
    • 通过管道 c := make(chan os.Signal, 1) 捕捉中断信号如 ctrl + c , 当捕捉 os.signal 成功时会 return nil 结束函数返回给 main()
  • 那么这个代码在输入 ctrl + c 时究竟有没有退出?我们来验证一下
    • 当程序启动会读取 application.yml 启动 grpcmetric
    metricPort: 5854
    grpc:addr: 127.0.0.1:11500
    
    • 启动程序后grep端口
     go run main.gonetstat -lntp | grep -E '5854|11500'
    
    在这里插入图片描述
    • 输入 ctrl + c 结束进程, 并且查看端口
      在这里插入图片描述
  • 可以看到当 app.go 的调试日志信息 user app quit 打印之后 , grpc端口 11500 是正常关闭了
    • 但是 mainmetric 服务未停止
  • 假如,我们将 mainselect {} 去掉,让 metricapp.Run(context.Background()) 的结束而结束,重新再试一遍
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

结论

  • main.go 代码 select {} 去除后,metric.Serve() 将随 app.Run(context.Background()) 结束而结束,因为 app.Run 是 main 唯一的阻塞条件,因此 main 不需要接收信号也能退出
    • 之所以会这样考虑,是因为信号被 app.go 处理了,所以 ctrl + c 没有作用于 main.go
    • 因此 main.goselect 会一直阻塞造成无法退出
http://www.khdw.cn/news/51565.html

相关文章:

  • 潍坊住房和城乡建设厅网站电话抖音关键词排名软件
  • 建站abc小程序营销伎巧第一季
  • 网站推广品牌seo的工作流程
  • 成都游戏网站开发爱网站
  • 免费的国外代理ipseo排名优化首页
  • 深圳通公司网站国内免费b2b网站大全
  • 淘宝网站建设 深圳重庆网站外包
  • 学java做网站需要学什么中国最大网站排名
  • favicon.ico wordpressseo 排名 优化
  • 本地南通网站建设如何快速收录一个网站的信息
  • 易语言网站怎么做图片外链工具
  • 做彩票网站服务器网站域名综合查询
  • 电脑版网页游戏网站如何优化
  • 官方网站建设工程规划不受容积率限制吗?商丘网站优化公司
  • 优设网文案素材win7一键优化工具
  • 沧州市网站制作公司优就业seo怎么样
  • 建设地方新闻网站的意义小红书推广平台
  • 天津去山西高铁做哪个网站北京百度seo排名点击软件
  • 动态网页制作精彩范例seo诊断a5
  • wordpress与typecho免费网站做seo
  • 百度推广客服电话24小时常州网站优化
  • 备案网站应用服务广东公共广告20120708
  • 石头科技 网站开发深圳网站优化哪家好
  • 百度品牌网站建设网站搭建需要什么
  • 做期货的一般看什么网站广告优化师怎么学
  • .net网站建设谷歌关键词排名查询工具
  • 信息发布网站开发模板昆明网络推广方式有哪些
  • 视频网站做视频节目赚钱吗电子营销主要做什么
  • 多种语言网站怎么做全能优化大师
  • 网站滚动图片代码福州seo网站排名