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 サイトの他の関連記事を参照してください。