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

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

http.TimeoutHandler 返回但 handlerfunc 繼續(xù)運(yùn)行

http.TimeoutHandler 返回但 handlerfunc 繼續(xù)運(yùn)行

Go
回首憶惘然 2023-08-21 14:28:40
我正在測試http.timeoutHandler我的Go Web服務(wù)器,我注意到3秒后我的客戶端調(diào)用收到一條“ Timeout”消息,但2秒后我可以在服務(wù)器日志上看到消息“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貢獻(xiàn)1873條經(jīng)驗 獲得超9個贊

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


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


如何做到這一點(diǎn)的示例:


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

客戶端收到發(fā)送的數(shù)據(jù):


My func!


查看完整回答
反對 回復(fù) 2023-08-21
  • 1 回答
  • 0 關(guān)注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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