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 サイトの他の関連記事を参照してください。