Go のコンテキストは、リクエストとともに任意の値を渡し、キャンセルを追跡するメカニズムを提供します。デフォルトでは、すべてのコンテキストが同じキャンセルメカニズムを共有します。ただし、特定のシナリオでは、コンテキストの伝播をキャンセルから切り離す必要がある場合があります。
リクエストの存続期間を超えてタスクを実行する HTTP ハンドラーを検討してください。応答を返した後、ハンドラーはゴルーチンで非同期タスクを開始できます。このタスクはコンテキスト値へのアクセスを必要とする場合がありますが、元のリクエスト コンテキストがキャンセルされた場合は終了しないでください。
WithoutCancel は Go 1.21 で導入され、簡単な方法を提供しました。非キャンセルコンテキストを作成します。このメソッドを使用すると、保存されているすべての値を含む元のコンテキストのコピーを取得できますが、キャンセル ステータスには依存しません。
Go 1.21 より前では、カスタム非キャンセルコンテキストの実装が必要でした。重要なのは、context.Context インターフェイスを満たす型を作成し、キャンセルを防ぐために次のメソッドをオーバーライドすることです。
さらに、実装は元のコンテキストを保存し、保存された値を取得するために Value() 呼び出しを委任する必要があります。
import ( "context" "github.com/mypackage/mycontext" ) func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := mycontext.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
非キャンセルコンテキストの背後にある原則を理解し、利用可能なツールを活用することで、開発者はカスタムソリューションを作成したり、Go の組み込み機能を利用して、キャンセルなしで目的のコンテキスト伝播を実現したりできます。
以上がキャンセル伝播を行わずに Go でコンテキストを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。