在 Go 中,上下文携带与执行相关的信息,例如截止日期和取消令牌。然而,某些场景可能需要创建一个单独的上下文,共享相同的数据,但不受原始上下文取消的影响。
当前的任务是创建一个“克隆” Go 上下文 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中文网其他相关文章!