为了账号安全,请及时绑定邮箱和手机立即绑定

大量数据竞争的 Web 应用程序

大量数据竞争的 Web 应用程序

Go
catspeake 2021-09-13 15:23:00
我正在编写一个 Web 应用程序。传入的请求将首先通过中间件。目前,我添加了两个中间件会话和安全性。遍历中间件后,它将执行请求的处理程序。会话和安全中间件将在它们自己的 goroutine 中执行。当我测试时,我有很多数据竞争,特别是在中间件部分我使用 negroni 来处理中间件作品。方式,我如何处理中间件func New(res http.ResponseWriter, req *http.Request, next http.HandlerFunc) {    if err := process(security.ServeHttp(res, req), session.ServeHttp(res, req)); err != nil {        res.WriteHeader(http.StatusInternalServerError)        return    }    log.Println("End of process middlewares")    next(res, req)}// Process all middlewaresfunc process(chErrs ...<-chan error) error {    for _, chErr := range chErrs {        // Will abort the loop, when error occurs        if err := <-chErr; err != nil {            return err        }    }    return nil}如您所见,每个中间件都有自己的频道。for 语句将循环直到错误通道关闭或错误发送。服务器配置func Config() *negroni.Negroni {    n := negroni.Classic()    n.Use(negroni.HandlerFunc(middlewares.New))    n.UseHandler(routes.Set())    return n}我的问题是,中间件是原因,为什么我有数据竞赛?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

事实上,你在 goroutine 中运行中间件是问题所在。

如果要并行运行中间件,则必须在 goroutine 中执行的任何中间件写入的内存周围设置互斥锁

在您的特定情况下,您正在编写和阅读ResponseWriter'sHeader


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信