ホームページ  >  記事  >  バックエンド開発  >  メインのコルーチン コンテキストのコピーをサブルーチン コンテキストに渡します。

メインのコルーチン コンテキストのコピーをサブルーチン コンテキストに渡します。

WBOY
WBOY転載
2024-02-09 23:30:09601ブラウズ

メインのコルーチン コンテキストのコピーをサブルーチン コンテキストに渡します。

PHP では、コルーチンはコードの実行効率を向上させる強力なプログラミング ツールです。コルーチンでは、メイン コルーチン コンテキストのコピーをサブルーチン コンテキストに渡すのが一般的な操作です。このようにして、サブルーチン内でメインコルーチンのコンテキストデータにアクセスし、データの共有と転送を実現します。 PHP ではこのプロセスは非常に簡単で、yield キーワードを使用するだけです。この記事では、メイン コルーチン コンテキストのコピーをサブルーチン コンテキストに渡す方法を詳しく紹介し、この機能をより深く理解し、適用するのに役立つサンプル コードをいくつか示します。

質問の内容

Golang API エンドポイントとそれに関連するコンテキストがあります。

エンドポイントは舞台裏で重い作業を行う必要があるため、メイン エンドポイント内に新しいサブルーチンを作成し、応答自体を返します。

コンテキストのキャンセルを処理するには、バックグラウンド コンテキストを作成し、それを新しいコンテキストとしてサブルーチンに渡します。

問題は、これを行うと、はい、バックグラウンドサブルーチンを実行できますが、リクエストID、スパンIDなどのメインコンテキストの値(ほとんどのキーがわかりません)であることです。 、トレースに使用されたものは失われます。

クライアントに応答が送信された後でも、実行をキャンセルせずに親コンテキストを子ルーチンに渡す方法。

######編集######

コンテキストに値を渡しません。 ただし、最初は追跡に必要な request-id、span-id などを渡しています。 この情報はすべてコンテキスト内にあります。 これは内部ライブラリであり、コンテキストはそれを保存する場所です。 これはコンテキストを使用して値を渡すアンチパターンであることはわかっています。リクエスト ID と、ビジネス ロジックではなくライブラリにとって重要なその他の値以外の値は渡されません

回避策

親コンテキストをキャンセルすると、そこから派生したすべてのコンテキストもキャンセルされます。したがって、リクエスト ハンドラーによって生成されたゴルーチンの新しいコンテキストを作成するのは正しいことです。

新しいコンテキストを作成するときは、関心のあるすべての値を元のコンテキストから新しいコンテキストにコピーする必要があります。しかし、すべてのキーを知っているわけではないと言いました。したがって、親コンテキストへの参照を保持して、その値をクエリできるようにすることができます。このようなもの: ### リーリー

これにより、キャンセルされた親コンテキストから値を検索する

context.background()

から新しいコンテキストが作成されます。

ハンドラーから作成されたゴルーチンにコンテキストとして

newcontext を渡します。

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

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