Введение в параллелизм Golang
Введение
В этой серии статей мы узнаем о параллелизме. Я собираюсь начать с базовой теории, чтобы объяснить вам, что такое параллелизм и как он работает на golang. После этого мы собираемся перейти к кодам и посмотреть пару примеров, связанных с ключевыми моментами, чтобы начать использовать параллелизм в ходу.
и, как обычно, после описания каждого пункта мы собираемся пояснить разработку и пример. Я попытался использовать простые примеры кода, но уверен, что это будет полезно для понимания каждой темы.
Надеюсь, статьи и темы вас заинтересуют.
Давайте начнем!!
Что такое параллелизм?
Другими словами, параллелизм — это возможность одновременного выполнения нескольких задач в одном процессе.
Возьмем реальный пример, человек, например, может смотреть фильм и в то же время пить пиво и слушать детей, которые играют во дворе.
Другой пример: теперь с человеческим телом мы используем наши глаза, мы дышим и ощущаем руками все в одно и то же время.
То же самое происходит с компьютерной системой, когда нам нужно будет выполнять разные задачи одновременно в текущем процессе, давайте рассмотрим пример. Представьте себе следующий вариант использования, приложению необходимо зарегистрировать новый клиент, чем в то время, чтобы отправить информация в серверную часть нам нужна, чтобы сохранить запись в базе данных, загрузить файлы в облако и отправить электронное письмо, вот когда мы начинаем думать о параллелизме.
Параллелизм против параллелизма
Теперь, когда мы понимаем, что такое параллелизм, и прежде чем приступить к нашему глубокому изучению темы, я хотел бы поговорить о параллелизме, потому что иногда разработчики путаются в терминах, поэтому мы знаем, что параллелизм — это возможность выполнять несколько задач одновременно. время через тот же процесс, теперь позвольте мне дать вам небольшое определение параллелизма.
Параллелизм — это возможность одновременного выполнения нескольких задач в двух или более процессах.
На следующем изображении мы могли видеть графическое представление обоих терминов.
Как Golang управляет параллелизмом?
В параллельном приложении Go мы можем видеть три актора или компонента: первый — горутина, второй — поток ОС или машина, а последний — контекст или процессор. Все три понятия составляют часть планировщика времени выполнения Go. ».
Согласно «V.N Nikhil» — «Среда выполнения Go использует стратегию планировщика, известную как расписание M:N, которое будет планировать M горутин на N потоков ОС» —.
Теперь позвольте мне дать вам краткое определение каждого из них.
- Горутина
Это логическая единица выполнения, которая определяет программу или функции для запуска. Она также содержит важную информацию, связанную с горутиной, такую как память стека, в которой машина/поток выполняет горутину. и трассировка стека. - Поток ОС или машина
Перед запуском потоки управляются ОС, а после этого, если планировщику нужно больше потоков, он может запросить их у ОС, а также может запросить на уничтожение неиспользованные. Здесь у нас есть информация, связанная с основной горутиной. - Контекст или процессор
С одной стороны, глобальный планировщик заботится о создании новых потоков для горутин, с другой стороны, процессор обрабатывает текущее выполнение, связанное с горутинами, а процессор обрабатывает горутины, использующие собственный внутренний планировщик и очередь выполнения, сохраняя горутины, которые будут выполняться в текущем контексте.
Перейти к модели разветвления
Golang работает по модели fork-join для управления горутинами, что означает, что программа может разделить процесс и позже в будущем снова присоединиться к основной горутине.
Позвольте мне показать вам на паре диаграмм, как работает модель fork-join.
На первой диаграмме мы видим случай, когда модель fork-join не замыкает весь круг. Возможен такой случай, потому что иногда нам не нужно ждать результата выполнения горутины.
Например, когда мы сохраняем запись в базе данных для создания нового клиента и одновременно сохраняем запись в нашей таблице аудита, в этом случае нам не нужно знать, был добавлен аудит или нет. чтобы продолжить логику.
На следующем изображении показан пример случая, когда вилочное соединение не создается:
Теперь случай, когда модель fork-join завершает весь цикл.
На следующем изображении показан пример случая, когда создается fork-join:
Примечание.
Не беспокойтесь, если вы новичок в golang или не понимаете логику параллелизма на изображениях выше. Я объясню на примерах, как использовать горутины и что группы ожидания
Подробнее о вилочной модели вы можете прочитать, нажав здесь.
Круто!, мы закончили с базовой теорией, связанной с горутинами, теперь пришло время перейти к следующим шагам.
Для каждого из них я посвящаю статью, чтобы объяснить, что это такое? Как это работает? Когда мы можем это использовать? и т. д., и покажите это на примере кода, чтобы было понятно, как использовать в реальных условиях.
Следующие шаги:
- Горутины
- Группы ожидания
- Мутекс
- "Каналы"
- Для выбора
- "Трубопровод"
- Пул потоков
Ссылки:
* Распределенные вычисления с Go — В. Н. Нихил Анураг
* Параллелизм в Go — Кэтрин Кокс-Будей
* Документация по Go