いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-286 (context.WithCancelとtime.AfterFuncでタイムアウト処理)

概要

以下、自分用のメモです。

コンテキストを使ったタイムアウト処理は 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

参考情報

github.com

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。