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

请求 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")
}
阅读 2.6k
2 个回答

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题