第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何正確關(guān)閉請求并在后臺繼續(xù)處理它

如何正確關(guān)閉請求并在后臺繼續(xù)處理它

Go
飲歌長嘯 2022-03-07 15:50:08
對于傳入的 HTTP 請求,我必須使用202 Accepted狀態(tài)碼進行響應,同時繼續(xù)在后臺處理有效負載。例如,這就是我目前正在做的事情:package mainimport (    "fmt"    "log"    "net/http"    "time"    "github.com/nbari/violetear")func sleep() {    time.Sleep(3 * time.Second)    fmt.Println("done...")}func index(w http.ResponseWriter, r *http.Request) {    w.WriteHeader(http.StatusAccepted)    go sleep()}func main() {    router := violetear.New()    router.HandleFunc("*", index)    http.Handle("/", router)    log.Fatal(http.ListenAndServe(":8080", router))}基本上,在我剛剛使用的處理程序上,然后在 goroutine 中WriteHeader調(diào)用該函數(shù):sleepfunc index(w http.ResponseWriter, r *http.Request) {    w.WriteHeader(http.StatusAccepted)    go sleep()}如果我想回復“200 OK”,我注意到我可以簡單地返回,例如:func index(w http.ResponseWriter, r *http.Request) {    go sleep()    return}因此想知道我是否應該總是返回我想關(guān)閉:func index(w http.ResponseWriter, r *http.Request) {    w.WriteHeader(http.StatusAccepted)    go sleep()    return}或者只寫標題然后調(diào)用 goroutine 就足夠了。
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經(jīng)驗 獲得超2個贊

從處理程序返回就足夠了,并且是應該做的。引自http.Handler

返回請求完成的信號;在 ServeHTTP 調(diào)用完成之后或同時使用 ResponseWriter 或從 Request.Body 讀取是無效的。

請注意,最后的return語句不是必需的,您可以簡單地省略它。執(zhí)行在其最后一條語句執(zhí)行時從處理程序返回,執(zhí)行不等待從函數(shù)啟動的 goroutines 完成。(請注意,延遲語句會先執(zhí)行,但這里沒有。)

同樣在返回時,如果未設置 HTTP 標頭,200 OK將自動設置。因此,如果您愿意202 Accepted,以下是最低要求:

func index(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusAccepted)
    go sleep()}

只需確保在從處理程序返回后不要在并發(fā) goroutine 中使用http.ResponseWriterandhttpRequest值,因為它們可能會被重用,因此您甚至不應該嘗試讀取它們。


查看完整回答
反對 回復 2022-03-07
  • 1 回答
  • 0 關(guān)注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號