1 回答

TA貢獻1815條經驗 獲得超6個贊
context.Context只能中繼發生超時或取消的消息。它無權實際停止任何 goroutines(有關詳細信息,請參閱取消 Go 中的阻塞操作)。goroutine 本身負責檢查超時和取消,并提前中止。
你有一個循環,它無條件地迭代 10 次并打印一些東西。而且您只在循環后檢查超時。
您必須將上下文檢查移動到循環中:
func F(ctx context.Context) error {
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
for i := 0; i < 10; i++ {
select {
case <-ctx.Done():
fmt.Println("TIME OUT")
return ctx.Err()
default:
time.Sleep(1 * time.Second)
fmt.Println("No: ", i)
}
}
fmt.Println("ALL DONE")
return nil
}
通過此更改,輸出將是(在Go Playground上嘗試):
No: 0
No: 1
No: 2
No: 3
TIME OUT
context deadline exceeded
注意:無論您看到"No: 3"打印可能會或可能不會發生,因為任何迭代都需要 1 秒,并且超時是 3 秒 = 3 * 迭代延遲,所以是先發生超時還是第 4 次迭代首先開始是“活潑的”。如果將超時時間減少到 2900 毫秒,"No: 3"則不會打印。
- 1 回答
- 0 關注
- 573 瀏覽
添加回答
舉報