登录
首页 >  Golang >  Go问答

为什么这个Go语言的HTTP服务器会在处理多个请求后停止响应?

来源:stackoverflow

时间:2024-03-20 19:00:31 464浏览 收藏

Go 语言 HTTP 服务器在处理多个请求后停止响应,原因是启动服务器的调用以 goroutine 方式执行。当服务器作为 goroutine 运行时,它会与主程序分离,导致服务器无法正常关闭。因此,服务器在处理一定数量的请求后会停止响应。

问题内容

我正在构建一个侦听端口 4242 的 go http 服务器。每个请求都会触发我的程序的一个功能。一切正常,但在 30/40 个请求之后,它就停止响应。

我已经在没有服务器的情况下运行整个程序(通过标准输入/标准输出与其交互),并且没有问题或错误。仅当我从 http 请求触发它时才会出现问题。

此外,当我在这些函数中添加一些工作负载时,我会更快地遇到错误。我怀疑是内存问题,但话又说回来,如果没有服务器,就不会有 bug。

服务器没有崩溃,也没有错误消息。我的函数代码实际上停止在随机行执行(尝试调试代码,发现例程实际上停止执行我的代码并每次都停止在随机位置)

package server

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
    "strconv"
    "time"

    "github.com/gogogomoku/gomoku/internal/brain"
    "github.com/gorilla/mux"
)

type SimpleResponse struct {
    ResCode int    `json:"code" xml:"code"`
    Message string `json:"message" xml:"message"`
}

func home(w http.ResponseWriter, r *http.Request) {
    // ..
}

func startGame(w http.ResponseWriter, r *http.Request) {
    // ..
}

func restartGame(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Request")
    fmt.Println(r)
    InitializeValues()
    StartRound()
    json.NewEncoder(w).Encode(GameRound)
    fmt.Println("Response")
    fmt.Println(w)
}

func MakeMove(w http.ResponseWriter, r *http.Request) {
    // ...
}

func StartServer() {
    router := mux.NewRouter().StrictSlash(true)
    router.Use(commonMiddleware)
    router.HandleFunc("/", home)
    router.HandleFunc("/start", startGame)
    router.HandleFunc("/restart", restartGame)
    router.HandleFunc("/move/{pos}/id/{id}", MakeMove)
    logger := log.New(os.Stdout, "http: ", log.LstdFlags)
    logger.Println("Server is starting...")
    srv := &http.Server{
        Handler:      router,
        Addr:         "localhost:4242",
        WriteTimeout: 5 * time.Second,
        ReadTimeout:  10 * time.Second,
        IdleTimeout:  15 * time.Second,
        ErrorLog:     logger,
    }
    if err := srv.ListenAndServe(); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func commonMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*")
        w.Header().Add("Content-Type", "application/json")
        next.ServeHTTP(w, r)
    })
}

例如,如果我在 http://localhost:4242/restart 上执行 http 请求,它们工作正常并且我得到 json。在 30/35 个请求之后,服务器似乎冻结了,我没有得到任何响应,没有崩溃,没有消息,什么都没有。

有什么想法吗?

谢谢!


解决方案


启动服务器的调用是作为 go 例程调用完成的:

go StartServer()

删除它似乎可以解决问题,但为什么这会成为问题呢? (当然,假设例程没有执行最后一条指令)

今天关于《为什么这个Go语言的HTTP服务器会在处理多个请求后停止响应?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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