首页 > 解决方案 > 为什么这个 go http 服务器在多次请求后停止响应?

问题描述

我正在构建一个监听端口 4242 的 Go http 服务器。每个请求都会触发我程序的一个功能。一切正常,但在 30/40 请求后,它只是停止回答。

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

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

服务器没有崩溃,也没有错误信息。我的功能代码实际上停止在随机行执行(尝试调试代码并看到例程实际上停止遍历我的代码并每次都停在随机位置)

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 个请求之后,服务器似乎冻结了,我没有得到任何响应,没有崩溃,没有消息,任何东西。

有任何想法吗?

谢谢!

标签: httpgoserver

解决方案


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

go StartServer()

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


推荐阅读