impressive17
@impressive17

Как создать новый контекст от старого игнорируя прерывание контекста в go?

Есть контекст с кенцелом. Мне нужно создать(унаследовать) от него новый контекст без кенцела и не потерять инфу (не Background() в общем).
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ghostiam
На Go писатель, серверов пинатель.
Оберните контекст в неотменяемый.
// 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы