Goでキャンセルを無視するコンテキストを作成するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-09 14:58:02
オリジナル
635 人が閲覧しました

How to Create a Context in Go That Ignores Cancellation?

Go でのキャンセル伝播を使用しないコンテキストの作成

Go では、コンテキストには期限やキャンセル トークンなどの実行関連の情報が含まれます。ただし、特定のシナリオでは、同じデータを共有するが、元のコンテキストのキャンセルの影響を受けない別のコンテキストを作成する必要がある場合があります。

問題ステートメント

当面のタスクは、「クローン」を作成することです。 " 次のような Go コンテキスト ctx (またはコピー):

  • 元のファイルに格納されているすべての値が含まれていますctx.
  • ctx がキャンセルされてもキャンセルされません。

解決策

context.Context はインターフェイスなので、context.Context を無視する独自の実装を定義できます。キャンセル信号。以下に例を示します。

package main

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

func main() {
    ctx := context.Background()
    clone := WithoutCancel(ctx)

    // Create a goroutine using the clone context.
    go func() {
        // This goroutine will never be interrupted by cancelations on `ctx`.
        time.Sleep(time.Second)
    }()
}
ログイン後にコピー

使用法

WithoutCancel 関数を使用すると、任意の関数またはメソッド内でクローン コンテキストを作成できます。

func f(ctx context.Context) {
    // Create a non-cancelable clone.
    clone := WithoutCancel(ctx)

    // Start an async task using the clone context.
    go func() {
        // This goroutine will not be affected by cancellations on `ctx`.
    }()
}
ログイン後にコピー

結論

このソリューションは、決してキャンセルされないコンテキストを作成する簡単な方法を提供し、存続期間を超えて非同期タスクを実行できるようにします。元のコンテキスト。これは、コンテキストのキャンセルによるバックグラウンド タスクの早期終了を回避したい場合に特に便利です。

以上がGoでキャンセルを無視するコンテキストを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート