非同期ジョブを処理する HTTP サーバー アプリケーションがあります。
リーリーユーザーは長時間実行される非同期ジョブをリクエストでき、アプリケーションは goroutine を作成した直後にリクエストに応答します。
リクエスト ID、認証済みトークン、およびユーザー情報をリクエストの context.Context
に入力します。また、Goroutineの下に置きたいと思います。ただし、リクエスト context
に同じ context
を使用すると、応答後に予期しないキャンセルが発生します。これは予期しない動作です。
親リクエスト context
とは独立して、すべての値を含む新しい context
を生成するにはどうすればよいですか?それとも、ゴルーチンの応答を取り込んだ後に context
が終了しないことを保証する他の方法はありますか?
追加の質問があります:
Job1
~ Job3
はシリアル化する必要があります。つまり、Job2
は Job1
と Job3
wait# まで待機する必要があります。 ##ジョブ2。また、
Job1A と
Job1B は同時に実行できます。特定の
context のキャンセルを伝播したい場合、そのパス (?) をキャンセルするにはどうすればよいですか?すべての関数の select ステートメントを確認する必要がありますか?
コンテキスト 無意味なタスクを実行せずにキャンセルと早期終了を広めるという概念。ただし、これをコードで処理する方法がわかりません。誰かが理解してくれたら嬉しいです。
ただし、どの値を伝播する必要があるかがわかっている場合は、それらの値をクエリして、それらの値を使用して新しいコンテキストを作成できます。
つまり、別のコンテキストの値を使用する新しいコンテキスト タイプを実装できます。
リーリー
これは、既存の値コンテキストとその他すべての新しいコンテキストを使用します。次に、新しい goroutine を開始して、新しいコンテキストを使用してリクエストの処理を続行します。
複数の同時ジョブを作成したい場合は、このゴルーチンでこれを行うことができます:
リーリー
これにより、コンテキストがキャンセルされると、両方のジョブがキャンセル通知を受け取ります。 job1とjob2のキャンセルを個別に制御したい場合:リーリー
連続するジョブ (つまり、ジョブ 1 の後にジョブ 3 が終了する) の場合は、それらを結合して 1 つのジョブのように見せます。コンテキストがキャンセルされたかどうかを確認するには、コンテキストの
Done チャネルで
select を実行するか、単純に次の内容を確認します。
リーリー
以上がGolang はコンテキストのすべての値をコピーしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。