サーチ…
構文
- タイプCancelFunc func()
- func背景()コンテキスト
- func TODO()コンテキスト
- func WithCancel(親コンテキスト)(ctxコンテキスト、キャンセルCancelFunc)
- func WithDeadline(親コンテキスト、締切時刻time.Time)(コンテキスト、CancelFunc)
- func WithTimeout(親コンテキスト、タイムアウト時間。継続時間)(コンテキスト、CancelFunc)
- func WithValue(親コンテキスト、キーインタフェース{}、valインタフェース{})
備考
context
パッケージ(Go 1.7)またはgolang.org/x/net/context
パッケージ(Pre 1.7)は、APIスコープの値とデッドラインをAPI境界やサービス間でgolang.org/x/net/context
するために使用できるコンテキストを作成するためのインタフェースです前記インタフェースの単純な実装として使用することができる。
さて、「文脈」という言葉は、樹木全体、または樹木内の個々の葉を指すためにゆるやかに使用されています。実際のcontext.Context
値
高レベルでは、コンテキストはツリーです。新しい葉が構築されるときにツリーに追加され(親値を持つcontext.Context
)、ツリーから葉が削除されることはありません。コンテキストは、その上のすべての値にアクセスできます(データアクセスは上向きにしか流れません)。また、コンテキストが取り消されると、その子も取り消されます(取り消し信号は下向きに伝播します)。キャンセル信号は、コンテキストがキャンセルされたときにクローズ(可読)されるチャネルを返す関数によって実装される。これにより、コンテキストは、 パイプラインと取り消しの並行処理パターンまたはタイムアウトを実装する非常に効率的な方法になります。
慣例により、コンテキストを取る関数は最初の引数ctx context.Context
持ちます。これは単なる慣習ですが、多くの静的分析ツールがこの引数を特に探すので、これは従うべきものです。 Contextはインターフェイスなので、既存のコンテキストライクなデータ(要求呼び出しチェーン全体に渡された値)を通常のGoコンテキストに変換し、いくつかのメソッドを実装するだけで下位互換性のある方法でそれらを使用することもできます。さらに、コンテキストは同時アクセスには安全ですので、多くのゴルーチン(パラレルスレッドで実行されているか、並行コルーチンで実行されているかに関係なく)を恐れなく使用できます。
参考文献
有向グラフとして表現されたコンテキストツリー
次のようなGoコードから構築された単純なコンテキストツリー(リクエストスコープであり、コンテキストに含まれるいくつかの一般的な値を含む)
// Pseudo-Go
ctx := context.WithValue(
context.WithDeadline(
context.WithValue(context.Background(), sidKey, sid),
time.Now().Add(30 * time.Minute),
),
ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())
次のような有向グラフとして表現できるツリーです:
各子コンテキストはその親コンテキストの値にアクセスできるため、データアクセスはツリー内で上向きに(黒色のエッジで表される)流れる。一方、取り消し信号はツリーを移動します(コンテキストがキャンセルされた場合、その子もすべて取り消されます)。相殺信号の流れは、灰色のエッジによって表される。
コンテキストを使用して作業を取り消す
タイムアウト(またはキャンセル機能付き)のコンテキストを長時間実行している関数に渡すと、その関数の作業を取り消すことができます。
ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
select {
case <-ctx.Done():
return ctx.Err()
default:
// Do an iteration of some long running work here!
}
}