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