1 回答

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
是的,這就是它的工作原理。
當(dāng)超時(shí)發(fā)生并且您的處理程序函數(shù)仍然運(yùn)行(尚未返回)時(shí),請(qǐng)求的上下文將被取消。您的處理程序負(fù)責(zé)監(jiān)視 Context 的 Done 通道,并在請(qǐng)求取消時(shí)中止其工作。每個(gè)處理程序都在自己的 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
客戶(hù)端收到發(fā)送的數(shù)據(jù):
My func!
- 1 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報(bào)