ホームページ  >  記事  >  バックエンド開発  >  伝播をキャンセルせずに Go でコンテキスト コピーを作成するにはどうすればよいですか?

伝播をキャンセルせずに Go でコンテキスト コピーを作成するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-08 21:46:01593ブラウズ

How to Create a Context Copy in Go Without Cancel Propagation?

Go でキャンセル伝播を行わないコンテキスト コピーを作成する

Go でコンテキストを操作する場合、同じ値を含むが、キャンセルに関しては独立して動作する既存のコンテキストのコピー。このシナリオは、たとえば、元のコンテキストを超えて存続する可能性がある HTTP リクエストに応答した後に非同期タスクを実行したい場合に発生します。

従来のアプローチでは、コンテキストに格納されているすべての可能な値を手動で追跡し、これらの値をコピーするための新しいコンテキスト。ただし、よりシンプルで管理しやすいソリューションが利用可能です。

Go 1.21 では、WithoutCancel 関数がコンテキスト パッケージに導入されました。この関数を使用すると、元のコンテキストからすべての値を継承するが、キャンセルの影響を受けない新しいコンテキストを作成できます。

import "context"

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return context.WithValue(context.Background(), context.NoCancel{}, struct{}{})
}

WithoutCancel を使用するには、単に次のように元のコンテキストをラップします。

func Handler(ctx context.Context) (interface{}, error) {
    result := doStuff(ctx)
    newContext := context.WithoutCancel(ctx)
    go func() {
        doSomethingElse(newContext)
    }()
    return result
}

これで、新しい goroutine は元のコンテキストのコピーを使用して動作するようになり、元のコンテキストがキャンセルされた場合にはキャンセルされません。これにより、非同期タスクの存続期間を管理する際に必要な柔軟性と制御が提供されます。

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

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