Контекст определяет тип контекста, который содержит крайние сроки, сигналы отмены и другие значения в области запроса через границы API и между процессами.
Входящие запросы к серверу должны создавать контекст, а исходящие вызовы к серверам должны принимать контекст.
Ошибка отмены контекста не обязательно означает ошибку тайм-аута.
Сценарий 1:
Если вы используете подпрограммы go, если родительская подпрограмма go завершается, но дочерняя подпрограмма все еще выполняется в фоновом режиме, а дочерняя подпрограмма go имеет контекст, общий для родительской подпрограммы go, это может привести к отмене контекста, если родительская подпрограмма go подпрограмма закрывает контекст перед выходом.
Поэтому, если дочерняя подпрограмма не зависит от контекста родительской подпрограммы, всегда рекомендуется создавать новый контекст для фоновых подпрограмм. Новый контекст может быть создан с помощью context.Background()
Сценарий 2:
Если ваше приложение основано на микрослужбе (или имеет несколько компонентов, которые вызывают друг друга с использованием контекстов), если микрослужба 1 вызывает микрослужбу 2, а микрослужба 2 явно закрывает или отменяет контекст, даже в этом случае вы можете получить эту ошибку.
Контекст можно закрыть, вызвав функцию cancel()
, как показано ниже:
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
Отмена этого контекста освобождает связанные с ним ресурсы. Таким образом, если вызываемый объект явно закрыл контекст, как показано выше, это может привести к ошибке отмены контекста в вызывающем объекте.
Эти ошибки отмены контекста можно обработать, проверив ошибку context.Canceled
из вызова grpc.Dial()
(если вы используете grpc).
person
Ashwin Shirva
schedule
15.06.2020