Контекстът е една от критичните функции в Go, която позволява паралелност. В Go „контекст“ се отнася до пакет, който предоставя функционалност за стойности с обхват на заявка и сигнали за анулиране през границите на API.
Контекстният пакет работи едновременно с паралелния модел на Go, базиран на концепцията за goroutines. Goroutines са леки нишки за изпълнение, които можете да създавате и управлявате ефективно, което улеснява създаването на едновременни програми в Go.
Контекстният пакет
Контекстният пакет предоставя функционалност за отмяна на дълготрайни функции или цели вериги на повиквания. Пакетът също така помага при съхраняване на стойности с обхват на заявка за достъп навсякъде във веригата на повикванията. Тази функция е удобна при работа с API или микроуслуги, където заявките могат да обхващат множество извиквания на функции и искате да ги отмените или да прикачите конкретни стойности към тях.
Ето как можете да импортирате контекстния пакет във вашия Go програми.
импортиране"контекст"
Контекстните функции приемат Контекст структурен тип на контекстния пакет. Обикновено трябва да използвате ctx като името на променливата на екземпляра.
функоперации(ctx контекст. контекст) {
}
Функциите могат да връщат типа структура на контекста за други функции и операции.
функоперации(ctx контекст. контекст)контекст.Контекст {
}
Можете да създадете нов контекст с ДА НАПРАВЯ функция на контекстния пакет. Функцията TODO създава нов контекст със стойността на контекст. Свършен(), канал, който ще се затвори при отмяна на контекста. Трябва да го използвате като контейнер, когато имате нужда от контекст, но нито един родителски контекст не е подходящ.
импортиране"контекст"
функосновен() {
ctx := контекст. ДА НАПРАВЯ()
}
Като алтернатива, Заден план създава нов контекст без стойност и празен канал Готово.
ctx := контекст. Заден план()
Трябва да използвате функцията Background като корен на контекстно дърво.
Контекст с ценности
Контекстният пакет предоставя функционалност за разпространение на стойности и сигнали за анулиране. Можете да използвате стойностите за информация от данни с обхват на заявка до сигнали за анулиране и крайни срокове.
Контекстният пакет също така позволява създаването на дъщерен контекст, наследен от родителски контексти, което позволява ефективно обработка на стойности и сигнали за анулиране в цялата програма, тъй като можете да прехвърлите контекста през множество функции.
Ето пример за предаване на контекст през функции с контекстния пакет.
импортиране (
"контекст"
)функvaluableContext(ctx контекст. контекст)контекст.Контекст {
връщане контекст. WithValue (ctx, "паролен ключ", "hfouneqcelkwfu")
}
функreceiveContextData(ctx контекст. контекст)всякакви {
passKey := ctx. Стойност ("паролен ключ")
връщане passKey
}
The valuableContext функцията приема контекстен екземпляр и връща контекстен екземпляр за следната функция. Инстанцията на контекста е стойност, създадена с WithValue метод. Методът WithValue взема екземпляра на контекста от функцията и двойка ключ-стойност.
За да извлечете данните от контекста, ще трябва да създадете нов контекст с ДА НАПРАВЯ или Заден план функция и предаване на контекста на функцията (в този случай valuableContext) и получаване на контекста с receiveContextData функция.
функосновен() {
ctx := контекст. Заден план()
ctx = стойностен контекст (ctx)
fmt. Println (receiveContextData (ctx))
}
Променливата ctx е екземплярът на контекста от функцията Background. Функцията valueContext приема променливата ctx и връща контекста със стойност, която получава функцията receiveContextData и връща стойността от двойката ключ-стойност.
Контекстни изчаквания и крайни срокове
The контекст Пакетът предоставя функционалност за задаване на изчаквания и крайни срокове в операциите. Задаването на изчакване и крайни срокове е полезно за операции, които трябва да наваксат.
Времето на изчакване е продължителността на времето, което отнема една операция. Можете да зададете време за изчакване за операция, която да отнеме 4 секунди; след това контекстът отменя заявката.
От друга страна, крайният срок определя абсолютната точка, в която операцията трябва да бъде отменена.
Можете да използвате WithTimeout метод за задаване на време за изчакване на контекста. Ето как можете да зададете 2-секундно изчакване.
функосновен() {
ctx, отмени := контекст. WithTimeout (контекст. Заден план(), 2 * време. второ)
отлагам отмени ()
// някаква операция
}
The основен функцията създава контекст с изчакване от две секунди. Функцията WithTimeout връща функция за отмяна, която можете да отложите за отмяна при излизане от основната функция.
Можете да декларирате срокове с С краен срок метод. Методът WithDeadline приема контекстен екземпляр и краен срок.
функнаправи нещо(ctx контекст. контекст) {
deadlineTime := време. Сега().Добавяне(1500 * време. милисекунда)
ctx, ctxCancel := контекст. WithDeadline (ctx, deadlineTime)
отлагам ctxCancel()// някаква операция
ctxCancel()
}
The направи нещо функцията приема контекст и краен срокВреме променливата е времето преди контекст краен срок. The ctx променлива е контекстът с краен срок.
The ctxCancel променливата анулира контекста, когато контекстът надхвърли крайния си срок.
Най-добри практики за използване на контексти в Go
Избягвайте използването на контексти като глобални променливи. Използването на контексти като глобални променливи може да доведе до неочаквано поведение на кода и трудни за проследяване грешки и използвайте контекста пестеливо, за да намалите сложността на кода.
И накрая, използвайте контекстите като сигнали, а не гаранции. Анулирането на контекст не гарантира, че всички goroutines ще спрат да се изпълняват; това е просто сигнал, а goroutines са агностик на контекста.