3 回答
TA贡献1850条经验 获得超11个赞
由于 context.Context 是一个接口,您可以简单地创建自己的永远不会取消的实现:
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}
}
TA贡献1868条经验 获得超4个赞
谁能建议应该如何完成?
是的。不要这样做。
如果您需要不同的上下文,例如对于您的异步后台任务,则创建一个新的上下文。您的传入上下文和您的后台任务之一无关,因此您不能尝试重用传入的上下文。
如果不相关的新上下文需要来自原始上下文的一些数据:复制您需要的内容并添加新内容。
TA贡献1772条经验 获得超5个赞
从 go 1.21 开始,此功能将通过以下方式直接在标准库中提供context.WithoutCancel
:
func WithoutCancel(parent Context) Context
WithoutCancel
返回 parent 的副本,当 parent 被取消时,该副本未被取消。返回的上下文不返回Deadline
orErr
,其Done
通道为nil
。调用Cause
返回的上下文返回nil
。
- 3 回答
- 0 关注
- 112 浏览
添加回答
举报