Введение в параллелизм 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 или не понимаете логику параллелизма на изображениях выше. Я объясню на примерах, как использовать горутины и что группы ожидания

Подробнее о вилочной модели вы можете прочитать, нажав здесь.

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

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

Следующие шаги:

  1. Горутины
  2. Группы ожидания
  3. Мутекс
  4. "Каналы"
  5. Для выбора
  6. "Трубопровод"
  7. Пул потоков

Ссылки:
* Распределенные вычисления с Go — В. Н. Нихил Анураг
* Параллелизм в Go — Кэтрин Кокс-Будей
* Документация по Go