以下の内容はhttps://devlights.hatenablog.com/entry/2023/01/27/073000より取得しました。


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


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

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




以上の内容はhttps://devlights.hatenablog.com/entry/2023/01/27/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14