问答

golang http server handler 里面协调会一直运行原因?

作者:admin 2021-04-22 我要评论

请求 HelloServer, 响应 "hello , world", 为什么主函数结束了, 里面协调会一直运行下去? go func() { for { fmt.Println("go go go") time.Sleep(2 * time.Sec...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

请求 HelloServer, 响应 "hello , world", 为什么主函数结束了,

里面协调会一直运行下去?

    go func() {
        for {
            fmt.Println("go go go")
            time.Sleep(2 * time.Second)
        }
    }()

完整代码:

package main

import (
    "fmt"
    "io"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", HelloServer)
    http.ListenAndServe("localhost:8082", nil)
}

func HelloServer(w http.ResponseWriter, r *http.Request) {
    // 为什么会一直运行?
    go func() {
        for {
            fmt.Println("go go go")
            time.Sleep(2 * time.Second)
        }
    }()
    io.WriteString(w, "hello , world")
}
###

你从 http.ListenAndServe 一直追溯源码的话,你会看到 func (srv *Server) Serve(l net.Listener) error 这个方法是有一个循环在一直开启新的协程处理请求,只有在 异常情况/主动关闭服务 才会退出。

简单总结下:如上的代码中,主协程走到srv.Serve方法就会一直循环处理,一旦有请求来到就会新开一个goroutine(1)来处理HelloServer这个handler,而这个handler又会新开一个goroutine(2)来处理handler中的循环。1 运行结束后直接退出,2 则因为是死循环会跟主协程的生命周期保持一致。

###

你的协程没有退出点也,肯定会一直执行,for语句本身就是无限循环了。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 求助!Mysql workbench connections出

    求助!Mysql workbench connections出

  • c++ 的dll 转golang可以调用

    c++ 的dll 转golang可以调用

  • c++的 new int{10}  和 new int(10) 有

    c++的 new int{10} 和 new int(10) 有

  • Grafana MySQL为数据源时, 折线图无法

    Grafana MySQL为数据源时, 折线图无法

腾讯云代理商
海外云服务器