1 回答

TA貢獻1804條經驗 獲得超2個贊
我剛剛對提供的解決方案進行了一些重構,現在它應該可以工作了。讓我指導您完成相關更改。
函數doSomething_
func doSomething(ctx context.Context) error {
fmt.Printf("%v - doSomething: start\n", time.Now())
select {
case <-ctx.Done():
fmt.Printf("%v - doSomething: cancelled\n", time.Now())
return ctx.Err()
case <-time.After(3 * time.Second):
fmt.Printf("%v - doSomething: processed\n", time.Now())
return nil
}
}
它等待取消輸入或在延遲幾秒后3返回給調用者。它接受一個上下文來監聽。
函數handleSomething_
func handleSomething(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
fmt.Printf("%v - handleRequestCtx: start\n", time.Now())
done := make(chan error)
go func() {
if err := doSomething(ctx); err != nil {
fmt.Printf("%v - handleRequestCtx: error %v\n", time.Now(), err)
done <- err
}
done <- nil
}()
select {
case <-ctx.Done():
fmt.Printf("%v - handleRequestCtx: cancelled\n", time.Now())
return
case err := <-done:
if err != nil {
fmt.Printf("%v - handleRequestCtx: error: %v\n", time.Now(), err)
w.WriteHeader(http.StatusInternalServerError)
return
}
fmt.Printf("%v - handleRequestCtx: processed\n", time.Now())
}
}
在這里,邏輯與您的邏輯非常相似。在 select 中,我們檢查接收到的錯誤是否存在nil,并根據此返回正確的 HTTP 狀態碼給調用者。如果我們收到取消輸入,我們將取消所有上下文鏈。
函數TestHandler_
func TestHandler(t *testing.T) {
r := mux.NewRouter()
r.HandleFunc("/demo", handleSomething)
srv := http.Server{
Addr: ":8000",
Handler: r,
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
if err := srv.ListenAndServe(); err != nil {
fmt.Println(err.Error())
}
}()
ctx := context.Background()
ctx, cancel := context.WithTimeout(ctx, 1*time.Second) // request canceled
// ctx, cancel := context.WithTimeout(ctx, 5*time.Second) // request processed
defer cancel()
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8000/demo", nil)
client := http.Client{}
res, err := client.Do(req)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Printf("res status code: %d\n", res.StatusCode)
}
srv.Shutdown(ctx)
wg.Wait()
}
在這里,我們啟動了一個 HTTP 服務器并通過http.Client. 可以看到有兩條語句設置上下文超時。如果您使用帶有評論的那個// request canceled,一切都將被取消,否則,如果您使用另一個,請求將被處理。
我希望這能澄清你的問題!
- 1 回答
- 0 關注
- 96 瀏覽
添加回答
舉報