Поиск…


Синтаксис

  • type CancelFunc func ()
  • func Background () Контекст
  • func TODO () Контекст
  • func WithCancel (родительский контекст) (ctx Context, cancel CancelFunc)
  • func WithDeadline (родительский контекст, время окончания времени.) (Context, CancelFunc)
  • func WithTimeout (parent Context, timeout time.Duration) (Context, CancelFunc)
  • func WithValue (родительский контекст, интерфейс клавиш {}, интерфейс val {})

замечания

Пакет context (в версии 1.7) или пакет golang.org/x/net/context (Pre 1.7) - это интерфейс для создания контекстов, которые могут использоваться для переноса значений и сроков охвата запроса через границы API и между службами как простая реализация упомянутого интерфейса.

в стороне: слово «контекст» свободно используется для обозначения всего дерева или отдельных листьев в дереве, например. фактический context.Context . context.Context значения.

На высоком уровне контекст - это дерево. Новые листья добавляются к дереву при их построении ( context.Context с родительским значением), а листья никогда не удаляются из дерева. Любой контекст имеет доступ ко всем вышеперечисленным значениям (доступ к данным только течет вверх), и, если какой-либо контекст отменен, его дети также отменены (сигналы отмены протаиваются вниз). Сигнал отмены реализуется с помощью функции, которая возвращает канал, который будет закрыт (доступен для чтения), когда контекст отменяется; это делает контексты очень эффективным способом реализации шаблона параллелизма конвейера и отмены или тайм-аутов.

По соглашению функции, которые принимают контекст, имеют первый аргумент ctx context.Context . Хотя это всего лишь соглашение, оно должно соблюдаться, поскольку многие инструменты статического анализа специально ищут этот аргумент. Поскольку Context является интерфейсом, также возможно превратить существующие контекстно-подобные данные (значения, которые передаются по всей цепочке вызовов запроса) в обычный контекст Go и использовать их в обратном совместимом виде, просто используя несколько методов. Кроме того, контексты безопасны для одновременного доступа, поэтому вы можете использовать их из многих goroutines (независимо от того, работают ли они на параллельных потоках или как параллельные сопрограммы) без страха.

Дальнейшее чтение

Дерево контекста, представленное как ориентированный граф

Простое дерево контекста (содержащее некоторые общие значения, которые могут быть запрошены и включены в контекст), построенные из кода Go, как показано ниже:

// Pseudo-Go
ctx := context.WithValue(
    context.WithDeadline(
        context.WithValue(context.Background(), sidKey, sid),
        time.Now().Add(30 * time.Minute),
    ),
    ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())

Это дерево, которое может быть представлено как ориентированный граф, который выглядит так:

Контекст, представленный как ориентированный граф

Каждый дочерний контекст имеет доступ к значениям его родительских контекстов, поэтому доступ к данным идет вверх в дереве (представлен черными краями). Сигналы отмены, с другой стороны, перемещаются вниз по дереву (если контекст отменен, все его дети также отменены). Поток сигнала отмены представлен серыми краями.

Использование контекста для отмены работы

Передача контекста с тайм-аутом (или с функцией отмены) в функцию длительного действия может использоваться для отмены работы этих функций:

ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
        // Do an iteration of some long running work here!
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow