首页  >  文章  >  后端开发  >  如何在 Go 中创建一个不会取消的上下文?

如何在 Go 中创建一个不会取消的上下文?

Barbara Streisand
Barbara Streisand原创
2024-11-09 06:00:03708浏览

How to Create a Context in Go that Doesn't Cancel?

规避上下文取消传播

Go 中的上下文管理提供了一种在应用程序的不同部分之间传递数据并处理取消的方法。然而,当您需要一个继承原始数据但不受取消影响的上下文时,就会出现挑战。

为了满足这一需求,Go 1.21 在 context 包中引入了 WithoutCancel 方法,它满足了这一要求。

或者,如果您使用的是早期版本的 Go,您可以创建自己的上下文实现,该实现是专门为防止取消而设计的。操作方法如下:

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}
}

通过此自定义上下文实现,您可以获得原始上下文的副本:

  • 继承原始上下文中存储的所有值。
  • 即使在原始上下文被取消后仍保持活动状态。

这种方法允许您在单独的 goroutine 中运行异步任务,即使父上下文终止也能确保它们的执行。

以上是如何在 Go 中创建一个不会取消的上下文?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn