Контекст — одна из важнейших функций Go, обеспечивающая параллелизм. В Go «контекст» относится к пакету, который предоставляет функциональные возможности для значений в области запроса и сигналов отмены через границы API.
Пакет контекста работает одновременно с моделью параллелизма Go, основанной на концепции горутин. Горутины — это легкие потоки выполнения, которые вы можете эффективно создавать и управлять, упрощая создание параллельных программ в Go.
Контекстный пакет
Пакет контекста предоставляет функциональные возможности для отмены долго выполняющихся функций или целых цепочек вызовов. Пакет также помогает хранить значения в области запроса для доступа в любом месте цепочки вызовов. Эта функция удобна при работе с API или микросервисы, где запросы могут охватывать несколько вызовов функций, и вы хотите отменить их или присвоить им определенные значения.
Вот как вы можете импортировать пакет контекста в свой Программы Go.
Импортировать"контекст"
Контекстные функции принимают Контекст тип структуры контекстного пакета. Традиционно вы должны использовать ctx как имя переменной экземпляра.
функцияоперации(контекст ctx. контекст) {
}
Функции могут возвращать тип структуры Context для других функций и операций.
функцияоперации(контекст ctx. контекст)контекст.Контекст {
}
Вы можете создать новый контекст с помощью ДЕЛАТЬ функция контекстного пакета. Функция TODO создает новый контекст со значением контекст. Сделанный(), канал, который будет закрыт при отмене контекста. Вы должны использовать его в качестве заполнителя, когда вам нужен контекст, но родительские контексты не подходят.
Импортировать"контекст"
функцияосновной() {
ctx := контекст. ДЕЛАТЬ()
}
Альтернативно, Фон Функция создает новый контекст без значения и пустой канал Done.
ctx := контекст. Фон()
Вы должны использовать функцию Background в качестве корня контекстного дерева.
Контекст со значениями
Пакет контекста предоставляет функциональные возможности для распространения значений и сигналов отмены. Вы можете использовать значения для информации от данных в области запроса до сигналов отмены и крайних сроков.
Пакет контекста также позволяет создавать дочерний контекст, унаследованный от родительских контекстов, что позволяет эффективно обработка значений и сигналов отмены во всей программе, поскольку вы можете передавать контекст через несколько функции.
Вот пример передачи контекста через функции с помощью пакета context.
Импортировать (
"контекст"
)функцияценный контекст(контекст ctx. контекст)контекст.Контекст {
возвращаться контекст. Со значением (ctx, "ключ доступа", "hfouneqcelkwfu")
}
функцияполучитьконтекстдата(контекст ctx. контекст)любой {
ключ доступа := ctx. Ценить("ключ доступа")
возвращаться ключ доступа
}
ценный контекст функция принимает экземпляр контекста и возвращает экземпляр контекста для следующей функции. Экземпляр контекста — это значение, созданное с помощью Со значением метод. Метод WithValue берет экземпляр контекста из функции и пару ключ-значение.
Чтобы получить данные из контекста, вам нужно создать новый контекст с ДЕЛАТЬ или Фон функцию и передать контекст функции (в данном случае, ценный контекст) и получить контекст с получитьконтекстдата функция.
функцияосновной() {
ctx := контекст. Фон()
ctx = ценный контекст (ctx)
ФМТ. Println (receiveContextData (ctx))
}
Переменная ctx — это экземпляр контекста из фоновой функции. Функция valueContext принимает переменную ctx и возвращает контекст со значением, которое принимает функция receiveContextData и возвращает значение из пары ключ-значение.
Контекстные тайм-ауты и крайние сроки
контекст Пакет предоставляет функциональные возможности для установки тайм-аутов и крайних сроков в операциях. Установка тайм-аутов и крайних сроков полезна для операций, которые необходимо наверстать упущенное.
Тайм-ауты — это продолжительность времени, которое занимает операция. Вы можете установить тайм-аут для операции на 4 секунды; после этого контекст отменяет запрос.
С другой стороны, крайний срок определяет абсолютную точку, в которой операция должна быть отменена.
Вы можете использовать С таймаутом метод для установки тайм-аута контекста. Вот как вы можете установить 2-секундный тайм-аут.
функцияосновной() {
ctx, отмена := контекст. С таймаутом (контекст. Фон(), 2 * время. Второй)
отложить отмена()
// какая-то операция
}
основной Функция создает контекст с тайм-аутом в две секунды. Функция WithTimeout возвращает функцию отмены, которую вы можете отложить для отмены при выходе из основной функции.
Вы можете объявить сроки с Со сроком метод. Метод WithDeadline принимает экземпляр контекста и крайний срок.
функциясделай что-нибудь(контекст ctx. контекст) {
Крайний срок: = время. Сейчас().Добавить(1500 * время. Миллисекунда)
ctx, ctxCancel := контекст. WithDeadline (ctx, крайнее время)
отложить ctxCancel()// какая-то операция
ctxCancel()
}
сделай что-нибудь функция принимает контекст, а Крайний срокВремя переменная – время до контекст крайний срок. ctx переменная — это контекст с дедлайном.
ctxCancel переменная отменяет контекст, когда контекст превышает свой крайний срок.
Лучшие практики использования контекстов в Go
Избегайте использования контекстов в качестве глобальных переменных. Использование контекстов в качестве глобальных переменных может привести к непредвиденному поведению кода и трудно отслеживаемым ошибкам, поэтому экономно используйте контекст, чтобы уменьшить сложность кода.
Наконец, используйте контексты как сигналы, а не гарантии. Отмена контекста не гарантирует, что все горутины перестанут работать; это просто сигнал, а горутины не зависят от контекста.