Изучаем Golang. Урок №19. Concurrency (1). Goroutines. Defer. Panic/Recover

  Рет қаралды 13,523

ThisIsIT

ThisIsIT

Күн бұрын

В данном видео мы продолжаем изучать язык Go (Golang). Мы узнаем, что такое горутины (goroutines), научимся их создавать. Научимся использовать deferred функции, а так же обрабатывать panic
Исходный код: github.com/Satan3/golangLesso...
Телеграм канал: t.me/ThisIsItGo
Группа в Вк: club211076164
0:00 Содержание раздела
0:37 Содержание видео
1:09 Определение и свойства горутины
1:35 Конкурентное и параллельное выполнение
2:32 Создание горутины
4:46 Состояния горутины
5:25 Количество логических ядер: numCpu
6:43 Макс количество горутин, работающих параллельно maxProcs
8:00 Переключение горутин вручную: gosched
9:25 Переключение горутин планировщиком Go
10:52 Отложенные (deferred) функции
11:50 Порядок выполнения deferred функций
12:12 Изменение именованных возвращаемых значений с помощью deferred функций
13:09 Вычисление значений deferred функций
16:40 Определение паники (panic)
17:44 Создание паники
19:00 Обработка паники - recover
19:30 Поведение функции при появлении паники
20:18 Panic/recover это не try/catch
20:56 Мы сделали это

Пікірлер: 37
@user-qv1vh7pz6h
@user-qv1vh7pz6h Ай бұрын
Ваши уроки по Go - это настоящее искусство. Каждое объяснение пронизано глубоким пониманием и ясностью, что делает сложные концепции доступными даже для начинающих. Спасибо за ваш труд и страсть к обучению.
@danildinko6214
@danildinko6214 9 ай бұрын
Лучшее объяснение горутин в интернете
@slavik695
@slavik695 2 жыл бұрын
Игорь, красава реально хорошо и доступно рассказал
@thisisit7267
@thisisit7267 2 жыл бұрын
Спасибо, вообще долго не мог придумать, с чего начинать горутины рассказывать. Но дальше уже проще будет)
@DaniilHarik
@DaniilHarik Жыл бұрын
I like that you have screen divided into code and text summary, helps to digest topics easier
@user-yd8ds8yf9z
@user-yd8ds8yf9z 2 жыл бұрын
Наконец-то конкурентность☺. Спасибо 💜
@thisisit7267
@thisisit7267 2 жыл бұрын
Пожалуйста, дальше еще много интересного)
@Eoll_Wise
@Eoll_Wise 2 жыл бұрын
@@thisisit7267 Ждем с нетерпением и благодарностью. С нас лайкос + подписка + комент👍👍👌
@ndisu3847
@ndisu3847 2 жыл бұрын
@denispushkarev2471
@denispushkarev2471 Ай бұрын
Классные уроки, не поверхностные, классно сочетаются с книгой Jon Bodner. Не удивлюсь, если уроки были построены на базе этой книги)
@alexandr150ful
@alexandr150ful 2 жыл бұрын
Спасибо! Жду следующие уроки по конкурентности 👍
@developmentapp
@developmentapp Жыл бұрын
Молодец! Спасибо большое.
@dmitrykhrniak451
@dmitrykhrniak451 Жыл бұрын
спасибо мужик
@Svoboda2000
@Svoboda2000 2 жыл бұрын
хотел поставить лайк но оказывается уже поставил
@thisisit7267
@thisisit7267 2 жыл бұрын
Спасибо)
@user-vm5wx6oi5w
@user-vm5wx6oi5w 3 ай бұрын
Спасибо! Очень классное объяснение defer! У меня с этим были проблемы, но тут стало все гораздо понятнее. Можно ли сказать, что когда мы дописываем defer к анонимной функции, то мы сложили не в стек не принт, а вызов анонимной функции? Тогда все сходится, потому что после return значение i стало 10 и мы отложенно вызвали анонимную функцию 10 раз и получили 10 одинаковых принтов.
@aidamur
@aidamur Жыл бұрын
спасибо за видео
@user-pc2zx6wr1l
@user-pc2zx6wr1l 2 жыл бұрын
Thx!
@thisisit7267
@thisisit7267 2 жыл бұрын
You`re welcome)
@ILMIX007
@ILMIX007 10 ай бұрын
Спасибо бро!
@marpaxr3986
@marpaxr3986 Жыл бұрын
Спасибо за работу! Только экран, шрифт бы по крупнее, для удобства.
@andreichemeris4141
@andreichemeris4141 2 жыл бұрын
лайк поствали, на канал подписался, коментарий оставил
@kvokka2786
@kvokka2786 Жыл бұрын
Спасибо за уроки. возник вопрос : 14:39 почему на момент вызова функции i=10 а не 0 ?
@AlexEmelyanov86
@AlexEmelyanov86 Жыл бұрын
Здесь два момента вызова: первый - это вызов defer, а второй вызов функции завёрнутой внутри defer. Вызов defer проиcходит там где он находится в коде, а вызов завёрнутой функции происходи в момент выхода из функции в которой вызывался содержащий её defered. В строке 44 в момент вызова defer происходит захват аргументов для функции внутри, на каждом шаге i будет равно от 0 до 9. В строке 48 на момент вызова defer не нужно вычислять аргументы Println т.к. ещё вызов обёрнут в анонимную функцию, но у неё нет аргументов, i будет вычисляться в момент вызова анонимной функции в момент выхода из функции deferValues, а это момент цикл завершён и i=10.
@catmint8208
@catmint8208 2 жыл бұрын
Привет, как винда в плане программирования? Помню раньше многие предпочитали линукс или макос. Интересно, все таки лучше на линкус пересаживаться, или тут можно полноценно программировать.
@thisisit7267
@thisisit7267 2 жыл бұрын
Привет. Пока примеры простые и не требуют установки других вещей, типо бд, докера, очередей и т.п. я сижу на винде. К тому же тут OBS studio работает лучше, чем на linux. В дальнейшем скорее всего буду записывать на macOS. Вообще докер есть и на винде, всякие WSL, но я как-то не пробовал, да и зачем, когда проще лучше сразу работать с linux или macOS.
@Hide_in_bruh
@Hide_in_bruh 11 ай бұрын
Каждое ядро может выполнять только 1 поток за одну единицу времени, то есть если 6 ядер и 12 потоков, то закинуть одновременно горутины можно только в 6 потоков, а в остальных потоках оставшиеся 6 горутин будут ждать своей очереди для переключения ядра на другой поток. 6:05 получается, параллельно может выполняться 6 горутин, а оставшиеся 6 будут выполняться конкурентно по отношению к первым 6 горутинам. Разве не так?
@vitaliikaverin3120
@vitaliikaverin3120 2 жыл бұрын
на 16.33 есть (i). Что она дает в конкретно этом примере? Да и в целом это же просто функция с телом. Зачем там после тела скобки?
@thisisit7267
@thisisit7267 2 жыл бұрын
Конретно в этом примере мы объявляем анонимную функцию, которая принимает параметр int k, который потом распечатывается. Для вызова функции необходимо открыть круглые скобки и передать туда параметр. Проще говоря func(){} - объявление и сразу же () это ее вызов. Счетчик цикла i мы передаем в нашу функцию, внутри которой он доступен как параметр k, который мы далее распечатываем
@vitaliikaverin3120
@vitaliikaverin3120 2 жыл бұрын
@@thisisit7267 как раньше не понимал, когда функции в функциях изучал, так и тут вкурить не могу )) поправь, если не правильно мыслю: 1. Если мы вызываем функцию, мы пишем func Name(принимаемый параметр) возвращаемый параметр {тело}. И отдельно вызываем ее по Name(значение принимаемого параметра). 2. А когда функция без названия, мы пишем и вызываем ее в одном месте: func(принимаемый параметр) возвращаемый параметр {тело}(значение принимаемого параметра). И возвращаемый параметр отсутствует, т.к. в теле есть функция (или метод хз) Println, который печатает текст. Обычно возвращаемый параметр присутствует и есть return. А принимаемый параметр k int есть только во второй функции, поэтому в скобках нужно его указать (i).
@thisisit7267
@thisisit7267 2 жыл бұрын
Да, все верно. Вот тут набросал 3 возможные варианта работы с функциями: обычная функция, функция в переменной, анонимная функция: go.dev/play/p/KSjMl7mYEFV
@vitaliikaverin3120
@vitaliikaverin3120 2 жыл бұрын
@@thisisit7267 отлично, все укладывается теперь. Хорошие примеры
@romanbush5164
@romanbush5164 Жыл бұрын
Зачем нужны defer функции
@ffonord
@ffonord 8 ай бұрын
Это синтаксический сахар. Удобство заключается в том что, например, можно сразу после успешного открытия файла на чтение тут же, рядом через defer закрыть его (закрытие выполнится перед выходом из функции/метода). Это позволяет не следить за закрытием файла, если у вас много "ранних" выходов из функции/метода (когда много мест с return).
@vitaliikaverin3120
@vitaliikaverin3120 2 жыл бұрын
package main import "fmt" func main() { fmt.Println("Hello") fmt.Println(runtime.numCPU()) } при таком коде runtime должен подгрузиться автоматически, как fmt? Никак не могу загрузить библиотеку рантайм. Runtime подчеркивается (undefined: runtime (exit status 2)). numCPU not declared by package runtime. update: получилось подгрузить, но только через GOMAXPROCS(). numCPU не работает. update2: вот дибил, numCPU с маленькой написал
@uralkhanov1852
@uralkhanov1852 2 жыл бұрын
Почему-то без последней строки Println("Exit"), функция showNumbers не успевает выполниться, вот код: runtime.GOMAXPROCS(1) go showNumbers(100) runtime.Gosched() Успевает вывести рандомное количество чисел. Хотя включен один поток, из функции планировщик не должен выйти, пока не выполнится showNumbers?
@thisisit7267
@thisisit7267 2 жыл бұрын
На самом деле иногда планировщик может сам решить переключить горутину, например в случаях, когда у нас запущен бесконечный цикл или какая-либо горутина работает долго. Довольно сложно добиться предсказуемого поведения, используя gomaxprocs и gosсhed. Самый удобный способ это каналы и инструменты синхронизации пакета sync
Всё про конкурентность в Go
23:36
defer panic
Рет қаралды 15 М.
Why Is He Unhappy…?
00:26
Alan Chikin Chow
Рет қаралды 57 МЛН
Пробуем дженерики Go на практике
19:14
Николай Тузов — Golang
Рет қаралды 15 М.
How To Use Goroutines For Aggregating Data In Golang?!
17:15
Anthony GG
Рет қаралды 37 М.
Интерфейсы в Golang
14:22
Gopher School
Рет қаралды 46 М.
Go Concurrency Explained: Go Routines & Channels
7:50
Melkey
Рет қаралды 64 М.
Why Is He Unhappy…?
00:26
Alan Chikin Chow
Рет қаралды 57 МЛН