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

Поділитися
Вставка
  • Опубліковано 25 лис 2024

КОМЕНТАРІ • 90

  • @milestrifonov
    @milestrifonov 3 роки тому +36

    Стоило бы наверное добавить, что кроме как контекста или через канал у нас нет способа управления горутинами

    • @networkpy8352
      @networkpy8352 2 роки тому +7

      Контекст по факту это и есть управление через канал

    • @milestrifonov
      @milestrifonov 2 роки тому

      Согласен

    • @MrNewtasker
      @MrNewtasker 2 роки тому +1

      Ну как насчет того что вы просто передатите в рутину указатель на структуру в которой есть поле отвечающее за завершение работы рутины, и каждый раз его будете проверять?

    • @milestrifonov
      @milestrifonov 2 роки тому

      @@MrNewtasker для этого контекст и нужен

    • @MrNewtasker
      @MrNewtasker 2 роки тому

      Зачем мне контекст когда я могу просто булевую переменную в рутину пробросить, значение которой я могу поменять вне рутины? а в рутине проверять её в цикле.
      Вы же напсали что других способов кроме как канал или контекс для управления горутинами нет

  • @ArtemCYOU
    @ArtemCYOU 2 роки тому +19

    качество озвучки топ)

  • @zeuszanudav3474
    @zeuszanudav3474 2 роки тому +5

    Оч подробно, спасибо.
    Это один из вопросов, на котором я посыпался при собеседовании в компанию техногиганта(
    Сейчас вот последовательно иду по всем вопросам, по которым мой ответ не устроил.

  • @oilcake4392
    @oilcake4392 2 роки тому +5

    офигенно, действительно помогло понять. Однозначно лайк и подписка

  • @d-fyz
    @d-fyz 2 роки тому +15

    Класс, чертовски приятно слушать, голос приятный и музыка хорошая, и контент хороший! Хотелось бы больше слышать про production ready go service, трейсинг, логи, как работать с монгой, постгресом, апи, тротлинг, интегрейшен тесты, ну и про конкаренси тоже интересно. Спасибо за контент❤

    • @deferpanic
      @deferpanic  2 роки тому +6

      Спасибо! Записал ✍️ по плану пока видосы больше про основы, но и про такие вещи тоже не забуду )

  • @НикитаУхин-ч5б
    @НикитаУхин-ч5б 2 роки тому +5

    Какой классный канал, да еще и на русском, просто супер

  • @murad_shafii
    @murad_shafii Рік тому +4

    спасибо, подача очень приятная

  • @ИгорьДрандин
    @ИгорьДрандин 2 роки тому +3

    Спасибо! Лучшее видео по контексту! Невероятно круто.

  • @ДмитрийБережной-е2д

    спасибо вам, не могу сказать что сразу понял и усвоил, но хотя бы теперь есть понимание как его использовать))))

  • @rerurkful
    @rerurkful 2 роки тому +8

    Хочу отметить! Автору респект!!! Больше объяснений с примерами. Спасибо!

  • @unknownhero6187
    @unknownhero6187 2 роки тому +4

    Какое же крутое название канала!
    Хочу себе футболку с таким принтом

  • @aleksandrzaremba6520
    @aleksandrzaremba6520 9 місяців тому +1

    Спасибо автору, очень качественное видео и сильно экономит время перед собесом

  • @NasimBoboshoev
    @NasimBoboshoev Рік тому +1

    Красавчик! Всё четко и по делу.

  • @ilyaarsenov1594
    @ilyaarsenov1594 2 роки тому +2

    спасибо большое за крутое объяснение🫡

  • @mikhailrumpel
    @mikhailrumpel 2 роки тому +4

    Респект за названия сервисов такси, отдельное удовольствие было к ним вернуться :-)

  • @БекнурРаисов
    @БекнурРаисов 2 роки тому +4

    Крутые видосы! продолжайте в том же духе)

  • @Maksim-v6d
    @Maksim-v6d 2 роки тому +2

    Благодарю за урок!
    Удачи с каналом!

  • @ksivvi0
    @ksivvi0 2 роки тому +3

    отличный урок, подробно и с примерами!

  • @ЮлияКирпа-к4у
    @ЮлияКирпа-к4у 2 роки тому +3

    Видео просто супер и название канала топ!)
    Продолжайте в том же духе, очень талантливо!

  • @DarkKnight-in3qu
    @DarkKnight-in3qu Рік тому +1

    топ видео. Спасибо, бро!

  • @evans_black
    @evans_black 2 роки тому +7

    классный видос, очень познавательный! спасибо) делай видео почаще, у тебя хорошо получается

  • @UAStriker
    @UAStriker 2 роки тому +3

    Спасибо, все понятно! Давайте урок по sync.Pool

  • @AleksandrPopov-te8tq
    @AleksandrPopov-te8tq 7 місяців тому

    интересное, а главное, понятное и доступное видео)

  • @IvanFedulov
    @IvanFedulov 4 місяці тому

    великолепно, очень доходчиво. спасибо!

  • @НиколайШироков-т7л

    Отличное видео! Спасибо за разьяснения! В примере с такси можно словить deadlock.

  • @ТимофейЁлкин-о9е
    @ТимофейЁлкин-о9е 7 місяців тому

    Круто, респект! Хотелось бы ещё примеров с использованием deadline-ов и работы с БД через контексты.

  • @arseniks
    @arseniks Рік тому +4

    В примере с такси ошибка: на мощных компьютерах несколько горутин могут выполняться параллельно, соответсвенно несколько автомобилей одновременно могут попасть в winner, и случится "fatal error: all goroutines are asleep - deadlock!". Для исправления ошибки при создание канала надо сделать ему длину, равную количеству сервисов такси "make(chan string, 4)"

    • @antonpy7710
      @antonpy7710 9 місяців тому

      Канал не буф. Соответственно на чтении будет висеть 1 горутина, как только в канал попадет значение, оно вычитается

    • @arseniks
      @arseniks 9 місяців тому +1

      ⁠@@antonpy7710Да, но запись происходит в нескольких горутинах сразу параллельно (если на устройстве несколько ядер и ядра не заняты, то полностью параллельно). Соответственно при одновременном выпадении рандома, две горутины могут одновременно записать данные в не буф. канал и произойдет ошибка (первая запись заблокирует канал, прочитать и завершиться программа ещё не успеет, и а вторая запись в заблокированный канал вызовет ошибку). Этого можно избежать буферезированным каналом (размером по количеству служб такси)
      P.S. у меня эта ошибка как раз и возникала, поэтому и написал)

    • @factorevo2006-sv2mm
      @factorevo2006-sv2mm 9 днів тому +1

      благодарю!

  • @johnd.3293
    @johnd.3293 2 роки тому +3

    Спасибо

  • @paveltarasov4011
    @paveltarasov4011 Рік тому +2

    Хорошие, понятные примеры, респект👍

  • @БабаКапа-в7в
    @БабаКапа-в7в 2 роки тому +1

    Спасибо, крутой ролик. Я правильно понимаю, что в промере с запросами по сети в пакете httt/net в функции отправки запроса Do() контекст отменяется тем же механизмом for, select?

  • @davida.7586
    @davida.7586 2 роки тому +2

    Super !!!

  • @zhasulan87
    @zhasulan87 Рік тому +1

    Когда СТОИТ использовать контекст: +1 - обращение к базе данных

  • @vladimirmakarov6344
    @vladimirmakarov6344 2 роки тому

    Спасибо, хорошее видео, жду новых видео

  • @CloudOblakoRain
    @CloudOblakoRain 2 роки тому +1

    Классно, жаль мало видео.

    • @deferpanic
      @deferpanic  2 роки тому +4

      Спасибо, скоро будет ещё!

  • @stylizedworld8601
    @stylizedworld8601 3 роки тому +3

    Привет, подходит go как первый язык программирования? На сколько знаю на него переходят миддлы с других языков. Стоит ли вообще его рассматривать как первый язык?

    • @deferpanic
      @deferpanic  3 роки тому +5

      Привет. Ещё как подходит. Go не перегружен концепциями как многие другие мейнстримовые языки, обладает приятной кривой обучения, при этом позволяет писать производительные и качественные программы. В конце концов, если не понравится, язык всегда можно поменять ) с каждым изученным языком следующий даётся проще.

    • @stylizedworld8601
      @stylizedworld8601 3 роки тому +2

      @@deferpanic Спасибо за ответ, ждем еще видео :)

  • @TheDavBag
    @TheDavBag Рік тому

    всё ждал про ctx.Err(), но увы.
    по поводу хранимых контекстов чуть спорно, тк если структура умеет делать что-то асинхронно и состояние инкапсулировано и не имеет доступа извне, то почему нет?

  • @vladimirmakarov6344
    @vladimirmakarov6344 2 роки тому +1

    Автор, привет!
    Насколько я понимаю, в примере с такси допущена ошибка: если > 1 горутины будут одновременно записывать в resultCh, то все равно будет прочитано только одно значение, а остальные горутины останутся заблокированными.
    Поэтому, вместо просто resultCh

    • @JohnCena-td5js
      @JohnCena-td5js Рік тому

      Как в канал может одновременно записываться несколько значений?

    • @pix1c
      @pix1c 3 місяці тому

      @@JohnCena-td5js race condition загугли

  • @Мышыч
    @Мышыч 2 роки тому

    Спасибо за видео! Это было очень полезно и познавательно)
    В "Пример. Службы такси" ты забыл закрыть канал, пожалуйста не забывай это делать.
    Лучше всего использовать defer close(channel)

    • @shprodt8841
      @shprodt8841 2 роки тому +2

      А зачем закрывать канал? Его соберет сборщик мусора

    • @Мышыч
      @Мышыч 2 роки тому

      @@shprodt8841 Да, верно. Это не обязательно, но это удобно, чтобы пометить конец данных. Это используют, чтобы N горутин смогли понять, что какое-то событие завершилось (как в waitGroup например). Например n горутин читают из канала и они будут заблокированы, пока канал не закроется. Как только канал закроется горутины смогут прочитать значение по умолчанию и разблокируются. Этот подход используют еще в context.

    • @deferpanic
      @deferpanic  2 роки тому +2

      В этом примере как раз вместо использования close сверху каждая горутина слушает ctx.Done()

  • @nickvivanov9119
    @nickvivanov9119 2 роки тому +4

    Спасибо, отличный урок! Последний пример, я считаю, слишком сложный для новичков в go. Наверное, те, кому понятен этот пример, и так понимают что такое контекст. Хотелось бы видеть несколько как можно более простых примеров и их разбор.

    • @zeuszanudav3474
      @zeuszanudav3474 2 роки тому

      Увы это не 100% так. Полгода пишу коммерческий код на го, но использовал контекст только по армейскому принципу "делай как я". Там где старшие товарищи использовали, тогда и я использовал.
      Но позже при рефакторинге, много где из методов смог выкинуть контекст(в том числе из методов написанных и не мной).

  • @zverekkk_2532
    @zverekkk_2532 10 місяців тому

    Спасибо!

  • @Hande_hoch
    @Hande_hoch 20 днів тому

    почему в примере с такси иногда возникает дедлок? upd: мне объяснили, почему возникает дэдлок. Объясните плз, как это исправить. Как написать всё правильно. Пример то вроде хороший, и хотелось бы знать, как такое реализовать

  • @ВладФоменко-р4е

    Спасибо большое за крутые видео!

  • @АлександрБирюков-о2л

    я нихрена не понял, но так интересно!

  • @bdud_
    @bdud_ Місяць тому

    зоопарк горутин:) (подача материала/звук/голос топ)

  • @OlzhasKaribayev
    @OlzhasKaribayev 7 місяців тому

    perfect

  • @genjishimada4308
    @genjishimada4308 2 роки тому +2

    Привет, поделись, пожалуйста, названием своего терминала.
    Спасибо!

  • @lexgv
    @lexgv 2 роки тому

    Спасибо! Объясните, пожалуйста, как обойтись без контекста с вашим примером с авторизацией.

    • @deferpanic
      @deferpanic  2 роки тому +2

      Вариантов много. Вот два, которые пришли в голову первыми:
      1) Пусть next будет не http.Handler, а функция, принимающая кроме запроса и writer ещё и данные, которые вы хотите туда прокинуть. Вам правда тогда немного по-другому надо будет вызывать next.
      2) Дёргать аутентификацию в каждом хендлере.
      Первый, я думаю, поадекватнее и удобнее. Встречный вопрос: а зачем? :)

  • @maks6554
    @maks6554 Рік тому

    Нужно ли создавать новый контекст в функции на базе контекста, который передан параметром или можно использовать контект из параметра ?

    • @deferpanic
      @deferpanic  Рік тому +1

      Если нужно как-то модифицировать контекст (например, установить новый дедлайн или иметь отдельную функцию отмены на этом уровне), то да

  • @calypsegayndamrad8956
    @calypsegayndamrad8956 2 роки тому

    Здравствуйте, пример с такси в канал пишет 4 горутины, читает 1 горутина. Небезопасно, дедлок потенциальный.

    • @deferpanic
      @deferpanic  2 роки тому +1

      Конструкция с 4 пишущими и 1 читающей горутиной не приведёт к дедлоку, пока из канала кто-то читает. Если я что-то упустил, напишите, пожалуйста поподробнее )

  • @milestrifonov
    @milestrifonov 3 роки тому +1

    Есть ещё тема с context switch, которая сбивает с толку

    • @deferpanic
      @deferpanic  3 роки тому +1

      Ты имеешь ввиду scheduler, который прыгает по горутинам? Подумаю, может и про это видос сделаю

    • @milestrifonov
      @milestrifonov 2 роки тому

      @@deferpanic это шедуллер, но не гошный, а операционной системы

  • @ТимофейЁлкин-о9е
    @ТимофейЁлкин-о9е 7 місяців тому

    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  7 місяців тому +1

      А зачем? К тому же как произойдет выход из getContext, все созданные внутри контексты отменятся

    • @ТимофейЁлкин-о9е
      @ТимофейЁлкин-о9е 7 місяців тому

      @@deferpanic даа((( что, если нужно натянуть контекст на несколько методов? Причём, таймаут должен быть общим для всех, а доступа к main() нет?

  • @ИннокентийНебоходец

    Подскажи, а что за утилита http? Это httpie?

  • @JoCkStErTVchannel
    @JoCkStErTVchannel 3 місяці тому

    бит топ

  • @alexandersmirnov4274
    @alexandersmirnov4274 2 роки тому

    klass

  • @SHALfEY088
    @SHALfEY088 Рік тому

    какое ide?

  • @timickb
    @timickb 2 роки тому

    Не каждый может вернуться в 10 ноября 2009 года

    • @DarkKnight-in3qu
      @DarkKnight-in3qu Рік тому

      (если что это дата создания go)

  • @ShikeboSharifova
    @ShikeboSharifova 4 місяці тому

    спасибо