Изучаем Golang. Урок №20. Concurrency (2). WaitGroup. Data Race. Muxtex/RWMutex

preview_player
Показать описание
В данном видео мы продолжаем изучать язык Go (Golang). Мы изучим такие инструменты синхронизации из пакета sync, как WaitGroup, Mutex и RWMutex. Рассмотрим несколько usecase`ов и подводные камни при работе с ними.

0:00 Содержание
0:25 Горутины без синхронизации
1:08 Группа ожидания (WaitGroup)
5:27 Неправильное применение WaitGroup
7:23 Итог по WaitGroup
7:48 Выполнение работы в одной горутине
9:45 Параллельная запись из нескольких горутин
11:53 Data race
13:26 Mutex
17:15 Mutex vs RWMutex
22:22 Мы сделали это
Рекомендации по теме
Комментарии
Автор

Бро лучше тебя никто не объясняет. Честно, с тобой я начал искренне понимать глубокие аспекты го.

Желаю тебе и твоему каналу роста и популярности, и, надеюсь, ты создашь курс по общим паттернам и структуре сервисов в го потому, что с твоим обьяснением это было бы великолепно.

С меня лайк и подписка!

kmryznn
Автор

Очень надеюсь, ты дойдешь до конца и запишешь все планируемые уроки!

kiborg
Автор

желаю чтобы твой канал стал №1 по Golang

Svoboda
Автор

просто нереально полезные видео по многопоточности. Рекомендую всем знакомым, кто учит го. Огромное спасибо. Очень легкая подача, все понятно. Ты святой человек)

aidamur
Автор

самое лучшее объяснение, получше даже платных уроков! Вы гений! Я пришла после долгих попыток понять RWMutexы

AstanaKZ
Автор

Вы очень доходчиво объясняете. Большое спасибо за качественные уроки!

DmSi
Автор

Спасибо за уроки! Очень хорошо изложенная информация.

xfryigh
Автор

Очень круто и подробно объясняешь, спасибо! Надеюсь, новые видео не заставят себя ждать, а то последнее по модулям было 6 месяцев назад =(

georgiy_kulagin
Автор

Грац с 500 подписчиков) Крутые видео 👍🏼

MaximRovinsky
Автор

Отличное объяснение! Пожалуйста продолжай)

dasydasy
Автор

Спасибо наконецто понятно преемущество над другим языками, но отсутвие ооп все равно бесит)

romanbush
Автор

Самое понятное объяснение про RWMutex. Спасибо

TheDobermanTV
Автор

Спасибо за уроки, с удовольствием смотрю

Вопрос про 15 секунд
1000 раз по одной наносекунде (10 в -9 степени) получается 1 микросекунда (10 в -6 степени)
Как смогли получится секунды в примере без горутин - загадка

У меня на m1 вот такие результаты:

writeWithoutConcurrent:
1000
0.000464875
writeWithoutMutex:
986
0.000581708
writeWithMutex:
1000
0.000557375

То есть все колеблется около стат погрешности

DmitryZinovyev
Автор

Наконец-то я начал понимать, как работают мьютексы и WaitGroup, спасибо тебе)
UPD. Тем не менее я не понимаю, как так быстро выполняются 1к операций если при Lock одна горутина блокирует значение, пока сама его не поменяет, а другие стоят в очереди. Потом другая блокирует, меняет, а остальные- ждут. Это представляется так, будто горутин и нет вовсе, а значение просто переписывается как в обычном цикле, только почему-то в х1000+ раз быстрее
Хз, массу статей про горутины почитал, но не могу себе это как-то визуально представить.

vlnpckv
Автор

Я скопировал код функции, которая на видео выполнялась 15 секунд с вашего гит хаба. У меня она выполнилась за 2 десятитысячные секунды ( 0.0002 ), после протестировал функцию writeWithMutex, где мы для избежания data race лочили блок кода с записью в переменную, она у меня выполнилась за 5 десятитысячных ( в два с половиной раза медленнее). Я плохо понимаю, для чего мы запускаем кучу горутин, если он все все-равно становятся в очередь и ждут своего времени на лок. Чем это лучше обычного цикла с поочередным выполнением? В нашем случае мы получили даже обратный эффект, так-как нам нужно инициализировать 1000 горутин. Также, как я понимаю, когда горутина спит наносекунду управление берет на себя другая горутина и выходит так, что первая горутина спит больше наносекунды и так постоянно (можете меня поправить, просто предположение).

Также я не понимаю, как функция в которой мы ждем наносекунду и добавляем единицу ( выполняется в простом цикле ) выполняется 15 секунд. За 1000 итераций команда time.Sleep(time.Nanosecond) в сумме даст одну милионную секунды, а все остальное время будет занимать операция добавления? То есть 1000 операций добавления выполняются (15 - 1 / 1 000 000) секунды? В этом моменте я вообще выпал =)

Я новичок, наверное многого не понимаю, буду благодарен за ответ =)

ennwy
Автор

Для чего ты в участок кода между mu.Lock() и mu.Unlock() добавляешь time.sleep(), когда рассказываешь про RWMutex, конечно оно так дольше будет работать) если убрать, то те же ~0.05 сек, что и до этого) ты как будто искусственно увеличиваешь время)

stanislawgupaliuk
Автор

Сколько бы я не смотрел видео про конкурентность все говорят что 1 горутина занимает 1 ядро процессора, но это не верно в Go встренный планировщик горутин и он позволяет запускать хоть 10к горутин на 1 ядре

nika
Автор

Стоит объяснить почему на практике лучше использовать не мьютекс, а указатель на мьютекс

vomrpvq
Автор

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

vitaliikaverin
Автор

Непонятно для чего в данном примере мы лочим горутины для чтения. Ведь данные там в любом случае будут в рандом порядке

flectere