概要
以下、自分用のメモです。
コンテキストを使ったタイムアウト処理は context.WithTimeout
を使ったら出来るのですが
それ以外にも time.AfterFunc
と組み合わせて処理することも出来ます。
同じことになるのですが、コンテキストを作るときにはまだタイムアウト時間が決まっていない場合ときなどに使ったりできます。
知っておくと便利かもしれません。どちらも使い所によるということですね。
1.20で context に CancelCause が増えることになると思うので、使うときが増えるかもしれません。
サンプル
package goroutines import ( "context" "time" "github.com/devlights/gomy/output" ) // ContextAndTimeAfterFunc は、Context と time.AfterFunc でキャンセルするサンプルです. func ContextAndTimeAfterFunc() error { // // 下の2つは同じ結果になるが、context.Err() の内容は異なる // useTimeAfterFunc() useWithTimeout() return nil } // useTimeAfterFunc は、context.WithCancel + time.AfterFunc でタイムアウトさせます func useTimeAfterFunc() { var ( ctx, cxl = context.WithCancel(context.Background()) ) time.AfterFunc(2*time.Second, func() { cxl() }) output.Stdoutl("[useTimeAfterFunc]", time.Now().Format("15:04:05")) { <-ctx.Done() output.Stdoutl("[useTimeAfterFunc]", ctx.Err()) } output.Stdoutl("[useTimeAfterFunc]", time.Now().Format("15:04:05")) } // useWithTimeout は、context.WithTimeout でタイムアウトさせます func useWithTimeout() { var ( ctx, cxl = context.WithTimeout(context.Background(), 2*time.Second) ) defer cxl() output.Stdoutl("[useWithTimeout]", time.Now().Format("15:04:05")) { <-ctx.Done() output.Stdoutl("[useWithTimeout]", ctx.Err()) } output.Stdoutl("[useWithTimeout]", time.Now().Format("15:04:05")) }
実行すると以下のようになります。
gitpod /workspace/try-golang (master) $ task task: [run] go run . -onetime ENTER EXAMPLE NAME: goroutines_context [Name] "goroutines_context_and_timeafterfunc" [useTimeAfterFunc] 04:15:48 [useTimeAfterFunc] context canceled [useTimeAfterFunc] 04:15:50 [useWithTimeout] 04:15:50 [useWithTimeout] context deadline exceeded [useWithTimeout] 04:15:52 [Elapsed] 4.001586619s
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。