Ну как насчет того что вы просто передатите в рутину указатель на структуру в которой есть поле отвечающее за завершение работы рутины, и каждый раз его будете проверять?
Зачем мне контекст когда я могу просто булевую переменную в рутину пробросить, значение которой я могу поменять вне рутины? а в рутине проверять её в цикле. Вы же напсали что других способов кроме как канал или контекс для управления горутинами нет
Оч подробно, спасибо. Это один из вопросов, на котором я посыпался при собеседовании в компанию техногиганта( Сейчас вот последовательно иду по всем вопросам, по которым мой ответ не устроил.
Класс, чертовски приятно слушать, голос приятный и музыка хорошая, и контент хороший! Хотелось бы больше слышать про production ready go service, трейсинг, логи, как работать с монгой, постгресом, апи, тротлинг, интегрейшен тесты, ну и про конкаренси тоже интересно. Спасибо за контент❤
В примере с такси ошибка: на мощных компьютерах несколько горутин могут выполняться параллельно, соответсвенно несколько автомобилей одновременно могут попасть в winner, и случится "fatal error: all goroutines are asleep - deadlock!". Для исправления ошибки при создание канала надо сделать ему длину, равную количеству сервисов такси "make(chan string, 4)"
@@antonpy7710Да, но запись происходит в нескольких горутинах сразу параллельно (если на устройстве несколько ядер и ядра не заняты, то полностью параллельно). Соответственно при одновременном выпадении рандома, две горутины могут одновременно записать данные в не буф. канал и произойдет ошибка (первая запись заблокирует канал, прочитать и завершиться программа ещё не успеет, и а вторая запись в заблокированный канал вызовет ошибку). Этого можно избежать буферезированным каналом (размером по количеству служб такси) P.S. у меня эта ошибка как раз и возникала, поэтому и написал)
Спасибо, крутой ролик. Я правильно понимаю, что в промере с запросами по сети в пакете httt/net в функции отправки запроса Do() контекст отменяется тем же механизмом for, select?
Спасибо, отличный урок! Последний пример, я считаю, слишком сложный для новичков в go. Наверное, те, кому понятен этот пример, и так понимают что такое контекст. Хотелось бы видеть несколько как можно более простых примеров и их разбор.
Увы это не 100% так. Полгода пишу коммерческий код на го, но использовал контекст только по армейскому принципу "делай как я". Там где старшие товарищи использовали, тогда и я использовал. Но позже при рефакторинге, много где из методов смог выкинуть контекст(в том числе из методов написанных и не мной).
Спасибо за видео! Это было очень полезно и познавательно) В "Пример. Службы такси" ты забыл закрыть канал, пожалуйста не забывай это делать. Лучше всего использовать defer close(channel)
@@shprodt8841 Да, верно. Это не обязательно, но это удобно, чтобы пометить конец данных. Это используют, чтобы N горутин смогли понять, что какое-то событие завершилось (как в waitGroup например). Например n горутин читают из канала и они будут заблокированы, пока канал не закроется. Как только канал закроется горутины смогут прочитать значение по умолчанию и разблокируются. Этот подход используют еще в context.
всё ждал про ctx.Err(), но увы. по поводу хранимых контекстов чуть спорно, тк если структура умеет делать что-то асинхронно и состояние инкапсулировано и не имеет доступа извне, то почему нет?
почему в примере с такси иногда возникает дедлок? upd: мне объяснили, почему возникает дэдлок. Объясните плз, как это исправить. Как написать всё правильно. Пример то вроде хороший, и хотелось бы знать, как такое реализовать
Автор, привет! Насколько я понимаю, в примере с такси допущена ошибка: если > 1 горутины будут одновременно записывать в resultCh, то все равно будет прочитано только одно значение, а остальные горутины останутся заблокированными. Поэтому, вместо просто resultCh
Привет, подходит go как первый язык программирования? На сколько знаю на него переходят миддлы с других языков. Стоит ли вообще его рассматривать как первый язык?
Привет. Ещё как подходит. Go не перегружен концепциями как многие другие мейнстримовые языки, обладает приятной кривой обучения, при этом позволяет писать производительные и качественные программы. В конце концов, если не понравится, язык всегда можно поменять ) с каждым изученным языком следующий даётся проще.
Вариантов много. Вот два, которые пришли в голову первыми: 1) Пусть next будет не http.Handler, а функция, принимающая кроме запроса и writer ещё и данные, которые вы хотите туда прокинуть. Вам правда тогда немного по-другому надо будет вызывать next. 2) Дёргать аутентификацию в каждом хендлере. Первый, я думаю, поадекватнее и удобнее. Встречный вопрос: а зачем? :)
Конструкция с 4 пишущими и 1 читающей горутиной не приведёт к дедлоку, пока из канала кто-то читает. Если я что-то упустил, напишите, пожалуйста поподробнее )
Стоило бы наверное добавить, что кроме как контекста или через канал у нас нет способа управления горутинами
Контекст по факту это и есть управление через канал
Согласен
Ну как насчет того что вы просто передатите в рутину указатель на структуру в которой есть поле отвечающее за завершение работы рутины, и каждый раз его будете проверять?
@@MrNewtasker для этого контекст и нужен
Зачем мне контекст когда я могу просто булевую переменную в рутину пробросить, значение которой я могу поменять вне рутины? а в рутине проверять её в цикле.
Вы же напсали что других способов кроме как канал или контекс для управления горутинами нет
Оч подробно, спасибо.
Это один из вопросов, на котором я посыпался при собеседовании в компанию техногиганта(
Сейчас вот последовательно иду по всем вопросам, по которым мой ответ не устроил.
качество озвучки топ)
Класс, чертовски приятно слушать, голос приятный и музыка хорошая, и контент хороший! Хотелось бы больше слышать про production ready go service, трейсинг, логи, как работать с монгой, постгресом, апи, тротлинг, интегрейшен тесты, ну и про конкаренси тоже интересно. Спасибо за контент❤
Спасибо! Записал ✍️ по плану пока видосы больше про основы, но и про такие вещи тоже не забуду )
спасибо вам, не могу сказать что сразу понял и усвоил, но хотя бы теперь есть понимание как его использовать))))
Респект за названия сервисов такси, отдельное удовольствие было к ним вернуться :-)
офигенно, действительно помогло понять. Однозначно лайк и подписка
спасибо, подача очень приятная
Спасибо! Лучшее видео по контексту! Невероятно круто.
Хочу отметить! Автору респект!!! Больше объяснений с примерами. Спасибо!
Спасибо автору, очень качественное видео и сильно экономит время перед собесом
Красавчик! Всё четко и по делу.
спасибо большое за крутое объяснение🫡
отличный урок, подробно и с примерами!
Какое же крутое название канала!
Хочу себе футболку с таким принтом
Благодарю за урок!
Удачи с каналом!
Крутые видосы! продолжайте в том же духе)
Отличное видео! Спасибо за разьяснения! В примере с такси можно словить deadlock.
Какой классный канал, да еще и на русском, просто супер
Спасибо, все понятно! Давайте урок по sync.Pool
Круто, респект! Хотелось бы ещё примеров с использованием deadline-ов и работы с БД через контексты.
Видео просто супер и название канала топ!)
Продолжайте в том же духе, очень талантливо!
топ видео. Спасибо, бро!
классный видос, очень познавательный! спасибо) делай видео почаще, у тебя хорошо получается
интересное, а главное, понятное и доступное видео)
В примере с такси ошибка: на мощных компьютерах несколько горутин могут выполняться параллельно, соответсвенно несколько автомобилей одновременно могут попасть в winner, и случится "fatal error: all goroutines are asleep - deadlock!". Для исправления ошибки при создание канала надо сделать ему длину, равную количеству сервисов такси "make(chan string, 4)"
Канал не буф. Соответственно на чтении будет висеть 1 горутина, как только в канал попадет значение, оно вычитается
@@antonpy7710Да, но запись происходит в нескольких горутинах сразу параллельно (если на устройстве несколько ядер и ядра не заняты, то полностью параллельно). Соответственно при одновременном выпадении рандома, две горутины могут одновременно записать данные в не буф. канал и произойдет ошибка (первая запись заблокирует канал, прочитать и завершиться программа ещё не успеет, и а вторая запись в заблокированный канал вызовет ошибку). Этого можно избежать буферезированным каналом (размером по количеству служб такси)
P.S. у меня эта ошибка как раз и возникала, поэтому и написал)
благодарю!
великолепно, очень доходчиво. спасибо!
Хорошие, понятные примеры, респект👍
Спасибо
Super !!!
Классно, жаль мало видео.
Спасибо, скоро будет ещё!
Спасибо, крутой ролик. Я правильно понимаю, что в промере с запросами по сети в пакете httt/net в функции отправки запроса Do() контекст отменяется тем же механизмом for, select?
Когда СТОИТ использовать контекст: +1 - обращение к базе данных
Спасибо, хорошее видео, жду новых видео
Спасибо, отличный урок! Последний пример, я считаю, слишком сложный для новичков в go. Наверное, те, кому понятен этот пример, и так понимают что такое контекст. Хотелось бы видеть несколько как можно более простых примеров и их разбор.
Увы это не 100% так. Полгода пишу коммерческий код на го, но использовал контекст только по армейскому принципу "делай как я". Там где старшие товарищи использовали, тогда и я использовал.
Но позже при рефакторинге, много где из методов смог выкинуть контекст(в том числе из методов написанных и не мной).
Спасибо за видео! Это было очень полезно и познавательно)
В "Пример. Службы такси" ты забыл закрыть канал, пожалуйста не забывай это делать.
Лучше всего использовать defer close(channel)
А зачем закрывать канал? Его соберет сборщик мусора
@@shprodt8841 Да, верно. Это не обязательно, но это удобно, чтобы пометить конец данных. Это используют, чтобы N горутин смогли понять, что какое-то событие завершилось (как в waitGroup например). Например n горутин читают из канала и они будут заблокированы, пока канал не закроется. Как только канал закроется горутины смогут прочитать значение по умолчанию и разблокируются. Этот подход используют еще в context.
В этом примере как раз вместо использования close сверху каждая горутина слушает ctx.Done()
Спасибо!
всё ждал про ctx.Err(), но увы.
по поводу хранимых контекстов чуть спорно, тк если структура умеет делать что-то асинхронно и состояние инкапсулировано и не имеет доступа извне, то почему нет?
почему в примере с такси иногда возникает дедлок? upd: мне объяснили, почему возникает дэдлок. Объясните плз, как это исправить. Как написать всё правильно. Пример то вроде хороший, и хотелось бы знать, как такое реализовать
я нихрена не понял, но так интересно!
perfect
Автор, привет!
Насколько я понимаю, в примере с такси допущена ошибка: если > 1 горутины будут одновременно записывать в resultCh, то все равно будет прочитано только одно значение, а остальные горутины останутся заблокированными.
Поэтому, вместо просто resultCh
Как в канал может одновременно записываться несколько значений?
@@JohnCena-td5js race condition загугли
Привет, подходит go как первый язык программирования? На сколько знаю на него переходят миддлы с других языков. Стоит ли вообще его рассматривать как первый язык?
Привет. Ещё как подходит. Go не перегружен концепциями как многие другие мейнстримовые языки, обладает приятной кривой обучения, при этом позволяет писать производительные и качественные программы. В конце концов, если не понравится, язык всегда можно поменять ) с каждым изученным языком следующий даётся проще.
@@deferpanic Спасибо за ответ, ждем еще видео :)
Спасибо! Объясните, пожалуйста, как обойтись без контекста с вашим примером с авторизацией.
Вариантов много. Вот два, которые пришли в голову первыми:
1) Пусть next будет не http.Handler, а функция, принимающая кроме запроса и writer ещё и данные, которые вы хотите туда прокинуть. Вам правда тогда немного по-другому надо будет вызывать next.
2) Дёргать аутентификацию в каждом хендлере.
Первый, я думаю, поадекватнее и удобнее. Встречный вопрос: а зачем? :)
Привет, поделись, пожалуйста, названием своего терминала.
Спасибо!
iTerm 2 + oh-my-zsh
Нужно ли создавать новый контекст в функции на базе контекста, который передан параметром или можно использовать контект из параметра ?
Если нужно как-то модифицировать контекст (например, установить новый дедлайн или иметь отдельную функцию отмены на этом уровне), то да
Спасибо большое за крутые видео!
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
}
Так допустимо делать?
А зачем? К тому же как произойдет выход из getContext, все созданные внутри контексты отменятся
@@deferpanic даа((( что, если нужно натянуть контекст на несколько методов? Причём, таймаут должен быть общим для всех, а доступа к main() нет?
бит топ
Здравствуйте, пример с такси в канал пишет 4 горутины, читает 1 горутина. Небезопасно, дедлок потенциальный.
Конструкция с 4 пишущими и 1 читающей горутиной не приведёт к дедлоку, пока из канала кто-то читает. Если я что-то упустил, напишите, пожалуйста поподробнее )
klass
Подскажи, а что за утилита http? Это httpie?
Всё так
какое ide?
Есть ещё тема с context switch, которая сбивает с толку
Ты имеешь ввиду scheduler, который прыгает по горутинам? Подумаю, может и про это видос сделаю
@@deferpanic это шедуллер, но не гошный, а операционной системы
Не каждый может вернуться в 10 ноября 2009 года
(если что это дата создания go)
зоопарк горутин:) (подача материала/звук/голос топ)
спасибо