首页 > 后端开发 > Golang > 正文

如何在 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 是一个接口,你可以定义自己的实现来忽略取消信号。下面是一个示例:

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板