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

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

http.TimeoutHandler 返回但 handlerfunc 繼續運行

http.TimeoutHandler 返回但 handlerfunc 繼續運行

Go
回首憶惘然 2023-08-21 14:28:40
我正在測試http.timeoutHandler我的Go Web服務器,我注意到3秒后我的客戶端調用收到一條“ Timeout”消息,但2秒后我可以在服務器日志上看到消息“My func Println”。為什么TimeoutHandler沒有取消我的func1?這是我正在使用的代碼:package mainimport (        "fmt"        "io"        "net/http"        "time")func func1(w http.ResponseWriter, req *http.Request) {        time.Sleep(5 * time.Second)        fmt.Println("My func Println")        io.WriteString(w, "My func!\n")}func main() {        srv := http.Server{                Addr:         ":9000",                WriteTimeout: 5 * time.Second,                Handler:      http.TimeoutHandler(http.HandlerFunc(func1), 3*time.Second, "Timeout!\n"),        }        if err := srv.ListenAndServe(); err != nil {                fmt.Printf("Server failed: %s\n", err)        }}
查看完整描述

1 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

是的,這就是它的工作原理。


當超時發生并且您的處理程序函數仍然運行(尚未返回)時,請求的上下文將被取消。您的處理程序負責監視 Context 的 Done 通道,并在請求取消時中止其工作。每個處理程序都在自己的 goroutine 中運行,并且 goroutine 不能從“外部”被終止或中斷。


如何做到這一點的示例:


func func1(w http.ResponseWriter, req *http.Request) {

    select {

    case <-time.After(5 * time.Second):

        fmt.Println("My func Println")

        io.WriteString(w, "My func!\n")

    case <-req.Context().Done():

        fmt.Println("Cancelled")

    }

}

這將輸出:


Cancelled

如果您將處理程序中的延遲更改為 2 秒:


case <-time.After(2 * time.Second):

輸出將是:


My func Println

客戶端收到發送的數據:


My func!


查看完整回答
反對 回復 2023-08-21
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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