登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-01-25 18:32:55 134浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《golang http server handler 里面协调会一直运行原因?》,聊聊go,希望可以帮助到正在努力赚钱的你。

问题内容

请求 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 则因为是死循环会跟主协程的生命周期保持一致。

今天关于《golang http server handler 里面协调会一直运行原因?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表