采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
http监听通过协程切换出去,主线程阻塞等待信号的设计考虑是怎样的?直接在主线程里监听外部连接,有信号来了依然会处理呀?
你的疑问是,每个外部连接进来我可以不用每次开个协程序,直接通过channel通道和工作池方式来处理对吧?
golang的http服务器大部分都是用直接go协程方式处理的,好处是golang自己处理调度,充分利用机器资源。
当然不否认直接用channel通道和工作池也能写出优秀代码
对比更加底层的实现如下: 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出来,想请教一下这样处理的考虑是什么。
我们考虑是一个协程运行多个监听服务,所以go出去了。当然对应的服务句柄我可以通过全局变量作关闭操作的。
非常感谢!
111
x'c
登录后可查看更多问答,登录/注册
简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关
1.4k 23
1.5k 9
989 8
1.4k 8
928 7