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

查看网站的注册时间小红书seo软件

查看网站的注册时间,小红书seo软件,龙岩公司注册,首页优化的公司棋牌游戏项目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.15wanjia.com/news/56680.html

相关文章:

  • vue做网站好吗百度投诉中心电话24个小时
  • 美国优秀网站seo快速排名软件
  • 做网站运营需要会什么杭州关键词优化测试
  • 邢台在百度上做个网站营销推广公司
  • 绍兴 网站制作网络营销渠道
  • 四川省网站备案下列关于seo优化说法不正确的是
  • 一个公司是否可以做多个网站百度知道入口
  • wordpress法律主题武汉seo服务多少钱
  • 生猪价格今日猪价查询泰州百度seo
  • 做公司网站的理念百度上怎么打广告宣传
  • 国度网络网站建设外国搜索引擎登录入口
  • 潍坊做网站哪家好公司做网站推广
  • 重庆观音桥网站建设北京网上推广
  • 佛山网站建设模板建站微博搜索引擎优化
  • 企业网站管理系统用哪个好关键词竞价排名名词解释
  • 网站下拉菜单怎么做网站推广优化c重庆
  • 微信官方网站是多少钱镇江关键字优化公司
  • 河南网站建设公如何开通网站
  • wordpress付费主题博客广州网站优化排名系统
  • wordpress社交媒体优化重庆网站排名优化教程
  • wordpress收缩昆明seo外包
  • 有哪些做兼职的设计网站有哪些工作网络营销公司做什么
  • 如何做别人网站镜像营销型网站建设公司价格
  • 电子商务网站建设摘要旅游网站平台都有哪些
  • wordpress全功能主题广州seo网站公司
  • web前端开发网站谷歌搜索广告优化
  • 外包网站问些什么问题推广代理登录页面
  • 做电影网站怎么赚钱谷歌网站
  • 西安品牌网站建设服务商人民日报最新消息
  • 甘肃省建设厅官网站站长之家最新网站