亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大量數據競爭的 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 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號