Оберните контекст в неотменяемый.
// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
return noCancel{ctx: ctx}
}
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) }
Вызывать как-то так:
package main
import (
"context"
"time"
)
func main() {
ctx := context.Background()
ctx, c := context.WithTimeout(ctx, 100*time.Millisecond)
defer c()
ctxNo := WithoutCancel(ctx)
...
}
Если после WithoutCancel установить новый таймаут, то новый таймаут будет работать и не отменится таймаутом который мог быть до WithoutCancel.