プログラム全体にタイムアウトを設定していて、また特定の関数にもタイムアウトを設定しているとき、どちらによるタイムアウトかを判定したい場合がある。
子contextのDone()
がclose
されたとき、親contextのDone()
がclose
されたかどうかをチェックするとよい。
func main() {
// 親のcontext
ctxP, cancelP := context.WithTimeout(context.Background(), 5*time.Second)
RETRY:
// 子のcontext
ctxC, cancelC := context.WithTimeout(ctxP, time.Second)
select {
case <-ctxC.Done():
cancelC()
select {
// 親のタイムアウト(終了)
case <-ctxP.Done():
cancelP()
fmt.Println("deadline of parent")
// 子のタイムアウト(リトライ)
default:
fmt.Println("deadline of child")
goto RETRY
}
}
}