ホームページ  >  記事  >  バックエンド開発  >  golang コンテキストは何に使用されますか?

golang コンテキストは何に使用されますか?

(*-*)浩
(*-*)浩オリジナル
2019-12-03 09:52:453059ブラウズ

golang コンテキストは何に使用されますか?

#context は Go1.7 から標準ライブラリに含まれています。その主な用途を一言で言えば、 goroutine のライフサイクルを制御することです。計算タスクが goroutine によって引き継がれ、何らかの理由 (タイムアウトまたは強制終了) で goroutine の計算タスクを中止したい場合、この Context が使用されます。 (推奨学習: go)

Golang 開発者にとって、context (コンテキスト) パッケージは馴染みのないものであってはなりません。しかし、多くの場合、私たちは怠け者で、それを見るだけ、またはそれがどのような役割を果たすことができるかだけを見て、それを深く掘り下げることはありません。

アプリケーション シナリオ: Go http パッケージのサーバーでは、各リクエストにはそれを処理する対応する goroutine があります。

リクエスト処理関数は通常、データベースや RPC サービスなどのバックエンド サービスにアクセスするために追加のゴルーチンを開始します。

リクエストの処理に使用されるゴルーチンは、通常、エンドユーザーの ID 認証情報、検証関連のトークン、リクエストの期限など、リクエストに固有のデータにアクセスする必要があります。

リクエストがキャンセルまたはタイムアウトした場合、リクエストの処理に使用されたすべての goroutine はすぐに終了する必要があり、その後、システムはこれらの goroutine によって占有されていたリソースを解放できます

Context Principle

コンテキスト呼び出しは連鎖する必要があり、新しいコンテキストは WithCancel、WithDeadline、WithTimeout、または WithValue を通じて派生されます。親コンテキストがキャンセルされると、その親コン​​テキストから派生したすべてのコンテキストがキャンセルされます。

context.WithXXX を渡すと、新しい Context と CancelFunc が返されます。 CancelFunc を呼び出すと、子がキャンセルされ、親による子への参照が削除され、すべてのタイマーが停止します。 CancelFunc の呼び出しに失敗すると、親がキャンセルされるかタイマーが起動するまで、子がリークされます。 go vet ツールは、CancelFuncs を使用してすべてのプロセス制御パスをチェックします。

ルールに従ってください

次のルールに従って、パッケージ間でインターフェイスの一貫性を保ち、静的分析ツールでコンテキストの伝播を確認できるようにします。

コンテキストを構造体に含めないでください。代わりに、コンテキストを最初のパラメータとして渡し、ctx という名前を付ける必要があります。 func DoSomething(ctx context.Context, arg Arg) error { // ... use ctx ... }

関数で許可されている場合でも、nil Context を渡さないでください。どの Context を使用すればよいかわからない場合は、context.TODO() を使用できます。

コンテキストを使用した値関連のメソッドは、プログラムおよびインターフェイスで渡されるリクエスト関連のメタデータにのみ使用する必要があります。一部のオプションのパラメーターを渡すために使用しないでください。

同じコンテキストを使用できます別の goroutine に渡されます。コンテキストは同時実行に対して安全です。

以上がgolang コンテキストは何に使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。