http - 为什么这个 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 个请求之后,服务器似乎冻结了,我没有得到任何响应,没有崩溃,没有消息,任何东西。
有任何想法吗?
谢谢!
解决方案
启动服务器的调用是作为 go 例程调用完成的:
go StartServer()
删除它似乎可以解决问题,但为什么这仍然是一个问题?(当然,假设例程没有执行最后一条指令)
推荐阅读
- node.js - 如何在 GET 请求的 EJS 文件中包含 JS 变量?
- android - 即使 FirebaseUser 不为空,FirebaseUser 也会返回空电子邮件
- angular - 如何在Angular中将字符串转换为数字
- scala - 编译器找不到伴随对象中定义的隐式定义
- c# - 有没有更快的方法来添加数组?
- python - 在python 2.7中对大数进行幂运算后长整数是错误的
- javascript - 即使我在 2 个不同的范围内声明变量,为什么仍然存在重复错误?
- javascript - Javascript fetch - 读取错误的请求响应时遇到问题
- swift - CollectionViewCell 返回表达式类型错误
- python - 使用在 python 2 中腌制的 python 3 取消腌制文件