ホームページ  >  記事  >  バックエンド開発  >  Go でキャンセルされないコンテキストを作成するには?

Go でキャンセルされないコンテキストを作成するには?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-09 06:00:03708ブラウズ

How to Create a Context in Go that Doesn't Cancel?

コンテキストキャンセル伝播の回避

Go のコンテキスト管理は、アプリケーションの異なる部分間でデータを渡し、キャンセルを処理する手段を提供します。ただし、元のデータを継承しながらキャンセルの影響を受けないコンテキストが必要な場合に問題が発生します。

このニーズに対処するために、Go 1.21 ではコンテキスト パッケージ内に WithoutCancel メソッドが導入され、この要件が満たされます。

以前のバージョンの Go を使用している場合は、キャンセルを防ぐように特別に設計された独自のコンテキスト実装を作成することもできます。その方法は次のとおりです:

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

このカスタム コンテキスト実装を使用すると、次の元のコンテキストのコピーを取得できます。

  • 元のコンテキストに格納されているすべての値を継承します。
  • 元のコンテキストがキャンセルされた後もアクティブのままです。

このアプローチにより、個別のゴルーチンで非同期タスクを実行でき、親コンテキストが終了した場合でも確実に実行されます。

以上がGo でキャンセルされないコンテキストを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。