golang コンテキストコンテキスト

1. コンテキストが必要な理由

Go http パッケージのサーバーでは、各リクエストにはそれを処理する対応する goroutine があります。リクエスト処理関数は通常、データベースや RPC サービスなどのバックエンド サービスにアクセスするために追加のゴルーチンを開始します。

リクエストの処理に使用されるゴルーチンは、通常、エンド ユーザーの ID 認証情報、検証関連のトークン、リクエストの期限など、リクエストに固有のデータにアクセスする必要があります。リクエストがキャンセルまたはタイムアウトした場合、システムがこれらのゴルーチンによって占有されているリソースを解放する前に、リクエストの処理に使用されるすべてのゴルーチンがすぐに終了する必要があります。

2. コンテキストインターフェイス

context.Contextこれは、実装する必要がある 4 つのメソッドを定義するインターフェイスです。

文法:


type Context interface {
    
    
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{
    
    }
    Err() error
    Value(key interface{
    
    }) interface{
    
    }
}

方法解释:

	Deadline():返回当前Context被取消的时间,也就是完成工作的截止时间(deadline);
	
	Done():返回一个Channel,这个Channel会在当前工作完成或者上下文被取消之后关闭,多次调用Done方法会返回同一个Channel;
	
	Err():返回当前Context结束的原因,它只会在Done返回的Channel被关闭时才会返回非空的值;如果当前Context被取消就会返回Canceled错误;如果当前Context超时就会返回DeadlineExceeded错误;
	
	Value():从Context中返回键对应的值,对于同一个上下文来说,多次调用Value 并传入相同的Key会返回相同的结果;


3. バックグラウンドメソッド

文法:


context.Background() Context

分析: Background() は主に main 関数、初期化、およびテスト コードで、最顶层ルート コンテキストであるコンテキスト ツリー構造のコンテキストとして使用されます。

4. シリーズ機能付き

1.WithCancelメソッド

WithCancel は、新しい Done チャネルを含む親ノードのコピーを返します。返されたコンテキストの Done チャネルは、返された cancel 関数が呼び出されたとき、または親コンテキストの Done チャネルが閉じられたときに閉じられます。

文法:


func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
 

2、WithDeadline 方法

deadlined 以降に調整された親コンテキストのコピーを返します。親コンテキストの期限がすでに d より早い場合、WithDeadline(parent, d) は意味的に親コンテキストと同等です。返されたコンテキストの Done チャネルは、期限が切れたとき、返された cancel 関数が呼び出されたとき、または親コンテキストの Done チャネルが閉じられたときのいずれか早い時点で閉じられます。

文法:


func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
 

3.WithTimeoutメソッド

WithTimeout は を返しますWithDeadline(parent, time.Now().Add(timeout))

文法:


func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
 

4.WithValueメソッド

WithValue 関数は、リクエスト スコープ内のデータと Context オブジェクトの間の関係を確立できます。WithValue は、キーに関連付けられた値が val である親ノードのコピーを返します。

文法:


func WithValue(parent Context, key, val interface{
    
    }) Context 
 

5. 使用上の注意

  1. コンテキストをパラメータの形式で明示的に渡すことをお勧めします。
  2. Context をパラメータとして受け取る関数メソッドは、最初のパラメータとして Context を使用する必要があります。
  3. Context を関数メソッドに渡すときは、nil を渡さないでください。何を渡せばよいかわからない場合は、次を使用してください。context.Background()
  4. Context の Value 関連メソッドは、リクエスト フィールドの必要なデータを渡す必要があり、オプションのパラメーターを渡すために使用しないでください。
  5. コンテキスト はい线程安全、複数のゴルーチンで安全に渡すことができます

おすすめ

転載: blog.csdn.net/change_any_time/article/details/128986783