Разбираемся с контекстами в

  Рет қаралды 33,236

defer panic

defer panic

Күн бұрын

Видео с примерами о том, как работать с контекстами в Go, как не допускать типичные ошибки и выжать максимум из пакета contex.
❤️ Реквизиты, если у вас есть желание поддержать меня и развитие канала:
Boosty - boosty.to/deferpanic
Patreon - / deferpanic
Donation Alerts - donationalerts.com/r/deferpanic
ETH - tomakado.eth
TON - tomakado.ton
BTC - 19xwFstmVQsVYqZP64iMVg1StLNSah6Smo
Telegram: t.me/deferpanic
Discord: / discord
Текстовая версия: blog.ildarkarymov.ru/posts/co...
00:00 - Вступление
00:39 - Что такое контекст?
01:39 - Пример. Звонок в ресторан
02:15 - context.WithTimeout()
02:45 - Пример. Запросы по сети
03:54 - Дерево контекстов
05:02 - Пример. Приоритетность тайматуов
05:59 - context.WithDeadline()
06:23 - Пример. Службы такси
09:46 - context.WithValue()
10:56 - Когда передавать данные через контекст?
11:31 - Пример. HTTP Middleware
14:26 - Когда использовать контекст?
15:05 - Немного общих советов
16:52 - Финал
Полезные ссылки:
- Документация к пакету context: pkg.go.dev/context
- Больше примеров от авторов языка: go.dev/blog/context
- Раздел о контекстах на Go by Example: gobyexample.com/context
#golang #go #context #конкурентность #программирование

Пікірлер: 82
@milestrifonov
@milestrifonov 2 жыл бұрын
Стоило бы наверное добавить, что кроме как контекста или через канал у нас нет способа управления горутинами
@networkpy8352
@networkpy8352 2 жыл бұрын
Контекст по факту это и есть управление через канал
@milestrifonov
@milestrifonov 2 жыл бұрын
Согласен
@MrNewtasker
@MrNewtasker 2 жыл бұрын
Ну как насчет того что вы просто передатите в рутину указатель на структуру в которой есть поле отвечающее за завершение работы рутины, и каждый раз его будете проверять?
@milestrifonov
@milestrifonov 2 жыл бұрын
@@MrNewtasker для этого контекст и нужен
@MrNewtasker
@MrNewtasker 2 жыл бұрын
Зачем мне контекст когда я могу просто булевую переменную в рутину пробросить, значение которой я могу поменять вне рутины? а в рутине проверять её в цикле. Вы же напсали что других способов кроме как канал или контекс для управления горутинами нет
@ArtemCYOU
@ArtemCYOU 2 жыл бұрын
качество озвучки топ)
@zeuszanudav3474
@zeuszanudav3474 Жыл бұрын
Оч подробно, спасибо. Это один из вопросов, на котором я посыпался при собеседовании в компанию техногиганта( Сейчас вот последовательно иду по всем вопросам, по которым мой ответ не устроил.
@davida.7586
@davida.7586 2 жыл бұрын
Super !!!
@user-ys9ud4xg7z
@user-ys9ud4xg7z Жыл бұрын
спасибо вам, не могу сказать что сразу понял и усвоил, но хотя бы теперь есть понимание как его использовать))))
@ksivvi0
@ksivvi0 2 жыл бұрын
отличный урок, подробно и с примерами!
@unknownhero6187
@unknownhero6187 2 жыл бұрын
Какое же крутое название канала! Хочу себе футболку с таким принтом
@user-ct8fp2mm9y
@user-ct8fp2mm9y 2 жыл бұрын
Благодарю за урок! Удачи с каналом!
@oilcake4392
@oilcake4392 2 жыл бұрын
офигенно, действительно помогло понять. Однозначно лайк и подписка
@user-nx4ki2qv7i
@user-nx4ki2qv7i 2 жыл бұрын
Спасибо! Лучшее видео по контексту! Невероятно круто.
@user-zy3vt9tt3u
@user-zy3vt9tt3u 2 жыл бұрын
Крутые видосы! продолжайте в том же духе)
@ilyaarsenov1594
@ilyaarsenov1594 Жыл бұрын
спасибо большое за крутое объяснение🫡
@user-lx2is9xd3p
@user-lx2is9xd3p 2 жыл бұрын
Видео просто супер и название канала топ!) Продолжайте в том же духе, очень талантливо!
@murad_shafii
@murad_shafii Жыл бұрын
спасибо, подача очень приятная
@user-cq8ph5gw9r
@user-cq8ph5gw9r Жыл бұрын
Красавчик! Всё четко и по делу.
@UAStriker
@UAStriker 2 жыл бұрын
Спасибо, все понятно! Давайте урок по sync.Pool
@user-pf3di3nk9k
@user-pf3di3nk9k Жыл бұрын
Какой классный канал, да еще и на русском, просто супер
@AleksandrPopov-te8tq
@AleksandrPopov-te8tq Ай бұрын
интересное, а главное, понятное и доступное видео)
@DarkKnight-in3qu
@DarkKnight-in3qu Жыл бұрын
топ видео. Спасибо, бро!
@user-zg8ij3kt1h
@user-zg8ij3kt1h Ай бұрын
Круто, респект! Хотелось бы ещё примеров с использованием deadline-ов и работы с БД через контексты.
@vladimirmakarov6344
@vladimirmakarov6344 2 жыл бұрын
Спасибо, хорошее видео, жду новых видео
@aleksandrzaremba6520
@aleksandrzaremba6520 3 ай бұрын
Спасибо автору, очень качественное видео и сильно экономит время перед собесом
@johnd.3293
@johnd.3293 2 жыл бұрын
Спасибо
@user-mb2so1tg5u
@user-mb2so1tg5u 10 ай бұрын
Отличное видео! Спасибо за разьяснения! В примере с такси можно словить deadlock.
@user-ky1fv4ul2c
@user-ky1fv4ul2c 6 ай бұрын
Спасибо большое за крутые видео!
@rerurkful
@rerurkful 2 жыл бұрын
Хочу отметить! Автору респект!!! Больше объяснений с примерами. Спасибо!
@mikhailrumpel
@mikhailrumpel 2 жыл бұрын
Респект за названия сервисов такси, отдельное удовольствие было к ним вернуться :-)
@d-fyz
@d-fyz 2 жыл бұрын
Класс, чертовски приятно слушать, голос приятный и музыка хорошая, и контент хороший! Хотелось бы больше слышать про production ready go service, трейсинг, логи, как работать с монгой, постгресом, апи, тротлинг, интегрейшен тесты, ну и про конкаренси тоже интересно. Спасибо за контент❤
@deferpanic
@deferpanic 2 жыл бұрын
Спасибо! Записал ✍️ по плану пока видосы больше про основы, но и про такие вещи тоже не забуду )
@zverekkk_2532
@zverekkk_2532 4 ай бұрын
Спасибо!
@evans_black
@evans_black 2 жыл бұрын
классный видос, очень познавательный! спасибо) делай видео почаще, у тебя хорошо получается
@OlzhasKaribayev
@OlzhasKaribayev Ай бұрын
perfect
@alexandersmirnov4274
@alexandersmirnov4274 2 жыл бұрын
klass
@zhasulan87
@zhasulan87 5 ай бұрын
Когда СТОИТ использовать контекст: +1 - обращение к базе данных
@paveltarasov4011
@paveltarasov4011 11 ай бұрын
Хорошие, понятные примеры, респект👍
@user-nh7eb5uf3z
@user-nh7eb5uf3z 2 жыл бұрын
я нихрена не понял, но так интересно!
@CloudOblakoRain
@CloudOblakoRain 2 жыл бұрын
Классно, жаль мало видео.
@deferpanic
@deferpanic 2 жыл бұрын
Спасибо, скоро будет ещё!
@user-eq8px2pd7n
@user-eq8px2pd7n Жыл бұрын
Спасибо, крутой ролик. Я правильно понимаю, что в промере с запросами по сети в пакете httt/net в функции отправки запроса Do() контекст отменяется тем же механизмом for, select?
@nickvivanov9119
@nickvivanov9119 2 жыл бұрын
Спасибо, отличный урок! Последний пример, я считаю, слишком сложный для новичков в go. Наверное, те, кому понятен этот пример, и так понимают что такое контекст. Хотелось бы видеть несколько как можно более простых примеров и их разбор.
@zeuszanudav3474
@zeuszanudav3474 Жыл бұрын
Увы это не 100% так. Полгода пишу коммерческий код на го, но использовал контекст только по армейскому принципу "делай как я". Там где старшие товарищи использовали, тогда и я использовал. Но позже при рефакторинге, много где из методов смог выкинуть контекст(в том числе из методов написанных и не мной).
@user-sb6xt8ps2x
@user-sb6xt8ps2x Жыл бұрын
Спасибо за видео! Это было очень полезно и познавательно) В "Пример. Службы такси" ты забыл закрыть канал, пожалуйста не забывай это делать. Лучше всего использовать defer close(channel)
@shprodt8841
@shprodt8841 Жыл бұрын
А зачем закрывать канал? Его соберет сборщик мусора
@user-sb6xt8ps2x
@user-sb6xt8ps2x Жыл бұрын
@@shprodt8841 Да, верно. Это не обязательно, но это удобно, чтобы пометить конец данных. Это используют, чтобы N горутин смогли понять, что какое-то событие завершилось (как в waitGroup например). Например n горутин читают из канала и они будут заблокированы, пока канал не закроется. Как только канал закроется горутины смогут прочитать значение по умолчанию и разблокируются. Этот подход используют еще в context.
@deferpanic
@deferpanic Жыл бұрын
В этом примере как раз вместо использования close сверху каждая горутина слушает ctx.Done()
@arseniks
@arseniks 8 ай бұрын
В примере с такси ошибка: на мощных компьютерах несколько горутин могут выполняться параллельно, соответсвенно несколько автомобилей одновременно могут попасть в winner, и случится "fatal error: all goroutines are asleep - deadlock!". Для исправления ошибки при создание канала надо сделать ему длину, равную количеству сервисов такси "make(chan string, 4)"
@antonpy7710
@antonpy7710 2 ай бұрын
Канал не буф. Соответственно на чтении будет висеть 1 горутина, как только в канал попадет значение, оно вычитается
@arseniks
@arseniks 2 ай бұрын
⁠@@antonpy7710Да, но запись происходит в нескольких горутинах сразу параллельно (если на устройстве несколько ядер и ядра не заняты, то полностью параллельно). Соответственно при одновременном выпадении рандома, две горутины могут одновременно записать данные в не буф. канал и произойдет ошибка (первая запись заблокирует канал, прочитать и завершиться программа ещё не успеет, и а вторая запись в заблокированный канал вызовет ошибку). Этого можно избежать буферезированным каналом (размером по количеству служб такси) P.S. у меня эта ошибка как раз и возникала, поэтому и написал)
@vladimirmakarov6344
@vladimirmakarov6344 Жыл бұрын
Автор, привет! Насколько я понимаю, в примере с такси допущена ошибка: если > 1 горутины будут одновременно записывать в resultCh, то все равно будет прочитано только одно значение, а остальные горутины останутся заблокированными. Поэтому, вместо просто resultCh
@JohnCena-td5js
@JohnCena-td5js 10 ай бұрын
Как в канал может одновременно записываться несколько значений?
@TheDavBag
@TheDavBag 9 ай бұрын
всё ждал про ctx.Err(), но увы. по поводу хранимых контекстов чуть спорно, тк если структура умеет делать что-то асинхронно и состояние инкапсулировано и не имеет доступа извне, то почему нет?
@lexgv
@lexgv 2 жыл бұрын
Спасибо! Объясните, пожалуйста, как обойтись без контекста с вашим примером с авторизацией.
@deferpanic
@deferpanic 2 жыл бұрын
Вариантов много. Вот два, которые пришли в голову первыми: 1) Пусть next будет не http.Handler, а функция, принимающая кроме запроса и writer ещё и данные, которые вы хотите туда прокинуть. Вам правда тогда немного по-другому надо будет вызывать next. 2) Дёргать аутентификацию в каждом хендлере. Первый, я думаю, поадекватнее и удобнее. Встречный вопрос: а зачем? :)
@maks6554
@maks6554 Жыл бұрын
Нужно ли создавать новый контекст в функции на базе контекста, который передан параметром или можно использовать контект из параметра ?
@deferpanic
@deferpanic Жыл бұрын
Если нужно как-то модифицировать контекст (например, установить новый дедлайн или иметь отдельную функцию отмены на этом уровне), то да
@stylizedworld8601
@stylizedworld8601 2 жыл бұрын
Привет, подходит go как первый язык программирования? На сколько знаю на него переходят миддлы с других языков. Стоит ли вообще его рассматривать как первый язык?
@deferpanic
@deferpanic 2 жыл бұрын
Привет. Ещё как подходит. Go не перегружен концепциями как многие другие мейнстримовые языки, обладает приятной кривой обучения, при этом позволяет писать производительные и качественные программы. В конце концов, если не понравится, язык всегда можно поменять ) с каждым изученным языком следующий даётся проще.
@stylizedworld8601
@stylizedworld8601 2 жыл бұрын
@@deferpanic Спасибо за ответ, ждем еще видео :)
@milestrifonov
@milestrifonov 2 жыл бұрын
Есть ещё тема с context switch, которая сбивает с толку
@deferpanic
@deferpanic 2 жыл бұрын
Ты имеешь ввиду scheduler, который прыгает по горутинам? Подумаю, может и про это видос сделаю
@milestrifonov
@milestrifonov 2 жыл бұрын
@@deferpanic это шедуллер, но не гошный, а операционной системы
@genjishimada4308
@genjishimada4308 Жыл бұрын
Привет, поделись, пожалуйста, названием своего терминала. Спасибо!
@deferpanic
@deferpanic Жыл бұрын
iTerm 2 + oh-my-zsh
@user-zg8ij3kt1h
@user-zg8ij3kt1h Ай бұрын
func (m *SQLMap) getContext() context.Context { const DefaultTimeout = time.Duration(60 * time.Second) ctx, cancel := context.WithTimeout(context.Background(), DefaultTimeout) defer cancel() newCtx, cancel := context.WithTimeout(ctx, m.timeout) defer cancel() return newCtx } Так допустимо делать?
@deferpanic
@deferpanic Ай бұрын
А зачем? К тому же как произойдет выход из getContext, все созданные внутри контексты отменятся
@user-zg8ij3kt1h
@user-zg8ij3kt1h Ай бұрын
@@deferpanic даа((( что, если нужно натянуть контекст на несколько методов? Причём, таймаут должен быть общим для всех, а доступа к main() нет?
@SHALfEY088
@SHALfEY088 6 ай бұрын
какое ide?
@calypsegayndamrad8956
@calypsegayndamrad8956 Жыл бұрын
Здравствуйте, пример с такси в канал пишет 4 горутины, читает 1 горутина. Небезопасно, дедлок потенциальный.
@deferpanic
@deferpanic Жыл бұрын
Конструкция с 4 пишущими и 1 читающей горутиной не приведёт к дедлоку, пока из канала кто-то читает. Если я что-то упустил, напишите, пожалуйста поподробнее )
@user-vp8kz6wl5x
@user-vp8kz6wl5x 6 ай бұрын
Подскажи, а что за утилита http? Это httpie?
@deferpanic
@deferpanic 5 ай бұрын
Всё так
@timickb
@timickb Жыл бұрын
Не каждый может вернуться в 10 ноября 2009 года
@DarkKnight-in3qu
@DarkKnight-in3qu Жыл бұрын
(если что это дата создания go)
GoLang Slice в деталях, простым языком
32:09
Николай Тузов — Golang
Рет қаралды 70 М.
Don't eat centipede 🪱😂
00:19
Nadir Sailov
Рет қаралды 20 МЛН
Barriga de grávida aconchegante? 🤔💡
00:10
Polar em português
Рет қаралды 76 МЛН
didn't want to let me in #tiktok
00:20
Анастасия Тарасова
Рет қаралды 11 МЛН
How To Use The Context Package In Golang?
17:03
Anthony GG
Рет қаралды 49 М.
Advanced Golang: Channels, Context and Interfaces Explained
22:17
Code With Ryan
Рет қаралды 106 М.
Golang's Mocking Techniques - Kyle Yost | hatchpad Huddle
41:20
Управление памятью и сборщиком мусора в Go
47:26
Московский клуб программистов
Рет қаралды 9 М.
Golang Context Explained - How To Use With Timeout
8:22
Melkey
Рет қаралды 15 М.
Как на самом деле устроен тип Map в Golang? | Golang под капотом
34:33
Как на самом деле устроены каналы в Golang? | Golang channels internals
41:31
Обработка ошибок в go в 2023
15:59
Evrone Development
Рет қаралды 1,6 М.
Добавления ключа в домофон ДомРу
0:18
How Neuralink Works 🧠
0:28
Zack D. Films
Рет қаралды 29 МЛН
Самая важная функция в телефоне?
0:27
Опросный
Рет қаралды 219 М.
📱 SAMSUNG, ЧТО С ЛИЦОМ? 🤡
0:46
Яблочный Маньяк
Рет қаралды 1,1 МЛН
Carregando telefone com carregador cortado
1:01
Andcarli
Рет қаралды 1 МЛН