请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于gin_scaffold 的实现的一点疑问

http监听通过协程切换出去,主线程阻塞等待信号的设计考虑是怎样的?直接在主线程里监听外部连接,有信号来了依然会处理呀?

正在回答

2回答

你的疑问是,每个外部连接进来我可以不用每次开个协程序,直接通过channel通道和工作池方式来处理对吧?

golang的http服务器大部分都是用直接go协程方式处理的,好处是golang自己处理调度,充分利用机器资源。

当然不否认直接用channel通道和工作池也能写出优秀代码

1 回复 有任何疑惑可以回复我~
  • 提问者 慕先生5391781 #1
    对比更加底层的实现如下:
    func main() {
    	// 创建路由器
    	mux := http.NewServeMux()
    	// 设置路由规则
    	mux.HandleFunc("/bye", sayBye)
    	// 创建服务器
    	server := &http.Server{
    		Addr:         Addr,
    		WriteTimeout: time.Second * 3,
    		Handler:      mux,
    	}
    	// 监听端口并提供服务
    	log.Println("Starting httpserver at "+Addr)
    	log.Fatal(server.ListenAndServe())
    }
    server的ListenAndServe方法先通过net.Listen建立一个监听l,
    然后调用l.Accept获得连接c
    最后通过c.serve启动一个新的协程进行连接处理。
    
    gin_scaffold的实现是:
    func HttpServerRun() {
    	gin.SetMode(lib.GetStringConf("base.base.debug_mode"))
    	r := InitRouter()
    	HttpSrvHandler = &http.Server{
    		Addr:           lib.GetStringConf("base.http.addr"),
    		Handler:        r,
    		ReadTimeout:    time.Duration(lib.GetIntConf("base.http.read_timeout")) * time.Second,
    		WriteTimeout:   time.Duration(lib.GetIntConf("base.http.write_timeout")) * time.Second,
    		MaxHeaderBytes: 1 << uint(lib.GetIntConf("base.http.max_header_bytes")),
    	}
    	go func() {
    		log.Printf(" [INFO] HttpServerRun:%s\n",lib.GetStringConf("base.http.addr"))
    		if err := HttpSrvHandler.ListenAndServe(); err != nil {
    			log.Fatalf(" [ERROR] HttpServerRun:%s err:%v\n", lib.GetStringConf("base.http.addr"), err)
    		}
    	}()
    }
    将ListenAndServe封装在了一个独立的协程里go出来,想请教一下这样处理的考虑是什么。
    回复 有任何疑惑可以回复我~ 2020-10-05 17:31:04
  • 牛儿吃草 回复 提问者 慕先生5391781 #2
    我们考虑是一个协程运行多个监听服务,所以go出去了。当然对应的服务句柄我可以通过全局变量作关闭操作的。
    回复 有任何疑惑可以回复我~ 2020-10-08 09:23:17
  • 提问者 慕先生5391781 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-10-13 13:30:12
weixin_了然_0vcxvcx 2020-10-10 14:31:38

111

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信