You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Gorilla Mux实现无状态HTTP连接解决并发异常?

问题根源:全局变量引发的并发冲突

你遇到的核心问题是全局变量Out被所有并发请求共享了。每个请求进入YourHandler后,都会修改同一个结构体的Code和Message字段,多个请求的修改操作互相覆盖、干扰,自然会出现状态码乱序、消息列表混杂的情况——这完全违背了HTTP服务无状态的设计原则。

解决方案:为每个请求创建独立的结构体实例

解决思路非常直接:把全局的Out结构体移到请求处理函数内部,让每个请求都拥有自己专属的结构体实例,这样各个请求之间的数据就不会互相干扰了。

修改后的代码如下:

package main

import (
 "encoding/json"
 "fmt"
 "github.com/gorilla/mux"
 "github.com/rs/cors"
 "net/http"
 "time"
)

// 定义公共的响应结构体,替代全局变量
type Response struct {
 Code    int           `json:"status"`
 Message []interface{} `json:"message"`
}

func YourHandler(w http.ResponseWriter, r *http.Request) {
 // 每个请求创建独立的Response实例,初始即为零值,无需手动清空
 out := Response{}
 
 w.Header().Set("Access-Control-Allow-Origin", "*")
 w.Header().Set("Access-Control-Allow-Headers","Content-Type,access-control-allow-origin, access-control-allow-headers")
 w.Header().Set("Content-Type", "application/json; charset=UTF-8")
 w.WriteHeader(http.StatusOK)

 for i := 0; i < 10; i++ {
  out.Code = i + 1 // 直接从1开始累加,逻辑更直观
  out.Message = append(out.Message, "Running...")
  time.Sleep(1000 * time.Millisecond)
  
  if err := json.NewEncoder(w).Encode(out); err != nil {
   http.Error(w, err.Error(), http.StatusInternalServerError)
   return // 出错后立即返回,避免后续无效执行
  }
 }
}

func main() {
 r := mux.NewRouter()
 r.StrictSlash(true);
 r.HandleFunc("/", YourHandler)
 handler := cors.New(cors.Options{
  AllowedOrigins: []string{"*"},
  AllowCredentials: true,
  Debug: true,
  AllowedHeaders: []string{"Content-Type"},
  AllowedMethods: []string{"GET"},
 }).Handler(r)
 fmt.Println("Working in localhost:5000")
 http.ListenAndServe(":5000", handler)
}
针对实际项目的扩展建议

考虑到你提到实际项目中结构、渲染函数、数据收集逻辑分属不同包,可以这样适配:

  • 将Response结构体定义在公共工具包中,方便其他包引用
  • 在请求处理函数中创建Response实例后,将其作为参数传递给数据收集、渲染等函数,确保每个请求的实例独立流转
  • 如果需要在多个函数间共享该实例,也可以将其存入请求的上下文(r.Context())中,注意上下文的生命周期与请求完全绑定,不会跨请求污染

这样修改后,不管有多少并发连接,每个请求都会独立维护自己的状态,按顺序返回1到10的状态码,完全满足无状态的要求。

内容的提问来源于stack exchange,提问作者Sirius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:02:43