Статья опубликована в рамках: Научного журнала «Студенческий» № 41(211)
Рубрика журнала: Информационные технологии
Скачать книгу(-и): скачать журнал часть 1, скачать журнал часть 2, скачать журнал часть 3, скачать журнал часть 4, скачать журнал часть 5, скачать журнал часть 6, скачать журнал часть 7
ИССЛЕДОВАНИЕ ПАРАЛЛЕЛИЗМА В ЯЗЫКЕ Go
STUDY ON PARALLELISM IN Go LANGUAGE
Maxim Beryanov
student, PIKT faculty, ITMO University,
Russia, Saint-Petersburg
АННОТАЦИЯ
Параллельное программирование – способ организации компьютерных вычислений, при котором программы разрабатываются как набор вычислительных процессов, работающих асинхронно и параллельно, увеличивая скорость разработки. В данной статье предлагается разобрать параллелизм с точки зрения языка Go – какие средства и подходы доступны для создания такого эффекта.
ABSTRACT
Parallel programming is a way of organizing program computing, where applications are developed as a set of computational processes that work asynchronously and in parallel, increasing the speed of development. This article proposes to analyze parallelism concerning Go language - which tools and ways are available to create such an effect.
Ключевые слова: Параллелизм, программирование, Go, WaitGroup.
Keywords: Parallelism, programming, Go, WaitGroup.
Параллелизм [1] в языке Go [2] – это возможность функций работать независимо друг от друга, непосредственно относящаяся к наличию набора независимо выполняющихся процессов. Для поддержки параллелизма язык Go предоставляет нам горутины – это функции, которые выполняются параллельно другим функциям или методам. Горутины довольно эффективны и легковесны (используют всего 2 КБ в стеке).
Сущность WaitGroup [3] в Go позволяет текущем потоку ожидать указанные горутины. Она входит в часть пакета sync главным образом по тому факту, что представляет собой механизм синхронизации, который блокирует выполнение программы (вернее текущего потока) до тех пор, пока выполнение горутин в рамках данной ожидающей группы не будет завершено.
Такие ожидающие группы важны, потому что они разрешают горутине блокировать поток исполнения и продолжать его. Без их использования приходилось бы вручную добавлять некоторую временную задержку в основной поток, чтобы дождаться завершения работы горутин. Использование WaitGroup гарантирует, что основной поток не завершится (заблокируется) до тех пор, пока функция Wait() ожидающей группы не разрешит дальнейшее исполнение.
WaitGroup поставляется с тремя основными методами, которые помогают блокировать выполнение программы. Чтобы определить количество горутин к ожиданию, WaitGroup поддерживает внутренний счетчик, который увеличивается с помощью метода Add(). Проще говоря, эта функция меняет значение (в положительную или отрицательную сторону) счетчика ожидающей группы. Если этот счетчик становится равным 0, WaitGroup освобождает горутины, заблокированные функцией Wait(). Важно отметить, что если счетчик становится отрицательным, код вызывает исключение (панику). Другой метод Wait() блокирует выполнение кода до тех пор, пока внутренний счетчик, поддерживаемый группой ожидания, не уменьшится до значения 0, как было сказано ранее. Как только горутина завершила свое выполнение, нужно уменьшить на 1 параметр счетчика, определенный в Add(). Этого можно добиться с помощью метода Done(). Обычно он используется в связке с оператором defer внутри исполняемого метода горутины (рисунок 1).
Рисунок 1. Пример использования WaitGroup
На рисунке выше можно увидеть, что мы создаем переменную waitGroup типа sync.WaitGroup (ожидающая группа). Затем вызов метода Add(5) сообщает группе, что от нее требуется дожидаться пока 5 горутин не завершат свою работу и не вызовут каждый раз метод Done(), обновляя группу ожидания и уменьшая счетчик на 1 при каждом своем завершении. Наконец, метод Wait() блокирует выполнение до тех пор, пока счетчик не достигнет 0 и все горутины не будут освобождены. Таким образом, мы со 100% гарантией получим пять сообщений в консоли при любом запуске программы, независимо от случая.
Список литературы:
- Введение в параллелизм [Электронный ресурс] URL: https://habr.com/ru/company/intel/blog/583286/ (дата обращения: 15.12.2022).
- Go [Электронный ресурс] URL: https://go.dev (дата обращения: 15.12.2022).
- WaitGroup [Электронный ресурс] URL: https://pkg.go.dev/sync (дата обращения: 15.12.2022).
Оставить комментарий