Go では、コンテキストには期限やキャンセル トークンなどの実行関連の情報が含まれます。ただし、特定のシナリオでは、同じデータを共有するが、元のコンテキストのキャンセルの影響を受けない別のコンテキストを作成する必要がある場合があります。
当面のタスクは、「クローン」を作成することです。 " 次のような Go コンテキスト 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 サイトの他の関連記事を参照してください。