ホームページ >バックエンド開発 >Golang >Golang はコンテキストのすべての値をコピーします

Golang はコンテキストのすべての値をコピーします

WBOY
WBOY転載
2024-02-05 23:39:07885ブラウズ

Golang はコンテキストのすべての値をコピーします

質問の内容

非同期ジョブを処理する HTTP サーバー アプリケーションがあります。

リーリー

ユーザーは長時間実行される非同期ジョブをリクエストでき、アプリケーションは goroutine を作成した直後にリクエストに応答します。

リクエスト ID、認証済みトークン、およびユーザー情報をリクエストの context.Context に入力します。また、Goroutineの下に置きたいと思います。ただし、リクエスト context に同じ context を使用すると、応答後に予期しないキャンセルが発生します。これは予期しない動作です。

親リクエスト context とは独立して、すべての値を含む新しい context を生成するにはどうすればよいですか?それとも、ゴルーチンの応答を取り込んだ後に context が終了しないことを保証する他の方法はありますか?

追加の質問があります:

Job1 ~ Job3 はシリアル化する必要があります。つまり、Job2Job1Job3 wait# まで待機する必要があります。 ##ジョブ2。また、Job1AJob1B は同時に実行できます。特定の context のキャンセルを伝播したい場合、そのパス (?) をキャンセルするにはどうすればよいですか?すべての関数の select ステートメントを確認する必要がありますか?

理解しました

コンテキスト 無意味なタスクを実行せずにキャンセルと早期終了を広めるという概念。ただし、これをコードで処理する方法がわかりません。誰かが理解してくれたら嬉しいです。


正解


コンテキスト内の値を検出できません。これらはマップとしてではなくコンテキスト レイヤーとして保存され、各レベルは値の保存方法の異なる実装を提供する可能性があります。

ただし、どの値を伝播する必要があるかがわかっている場合は、それらの値をクエリして、それらの値を使用して新しいコンテキストを作成できます。

つまり、別のコンテキストの値を使用する新しいコンテキスト タイプを実装できます。

リーリー

これは、既存の値コンテキストとその他すべての新しいコンテキストを使用します。

次に、新しい goroutine を開始して、新しいコンテキストを使用してリクエストの処理を続行します。

複数の同時ジョブを作成したい場合は、このゴルーチンでこれを行うことができます:

リーリー

これにより、コンテキストがキャンセルされると、両方のジョブがキャンセル通知を受け取ります。 job1とjob2のキャンセルを個別に制御したい場合:

リーリー

連続するジョブ (つまり、ジョブ 1 の後にジョブ 3 が終了する) の場合は、それらを結合して 1 つのジョブのように見せます。

コンテキストがキャンセルされたかどうかを確認するには、コンテキストの

Done チャネルで select を実行するか、単純に次の内容を確認します。 リーリー

以上がGolang はコンテキストのすべての値をコピーしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。