Использование группы ожидания в Golang на примере

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

Давайте возьмем следующий пример с использованием горутин. Основная функция продолжалась, не дожидаясь завершения горутин.

К счастью, Golang предоставляет пакет с именем sync, предоставляющий базовые методы синхронизации, которые могут помочь нам решить описанную выше проблему. WaitGroup — одна из них. Давайте посмотрим, что такое группа ожидания и как она поможет нам решить описанный выше сценарий.

К счастью, Golang предоставляет пакет с именем sync, предоставляющий базовые методы синхронизации, которые могут помочь нам решить описанную выше проблему. WaitGroup — одна из них. Давайте посмотрим, что такое группа ожидания и как она поможет нам решить описанный выше сценарий.

Что такое группа ожидания?

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

Он предоставляет различные методы, такие как «Добавить», «Готово» и «Подождите».

Добавить (дельта целое)

  • Он принимает целое число в качестве аргумента. Аргумент может быть отрицательным, и он будет действовать как Done().
  • Он увеличивает счетчик WaitGroup на указанное значение.
  • Его нужно вызывать перед оператором, создающим горутину, чтобы предотвратить условия гонки.

Сделанный ()

  • Это не требует никаких аргументов.
  • Это означает, что одна горутина завершила свое выполнение и уменьшает счетчик WaitGroup на 1.
  • Он должен выполняться в конце функции внутри горутины.

Ждать ()

  • Он блокирует основную программу до тех пор, пока счетчик группы ожидания не вернется к 0; что означает, что все горутины завершили свое выполнение.

Вот пример после использования WaitGroup.

Вы можете заметить, что основной процесс теперь ожидает завершения выполнения всех горутин.

Вы могли заметить, что мы создали ссылку на группу ожидания в начале основной функции. Это сделано для того, чтобы избежать копирования группы ожидания при ее передаче по приложению.

Внутри цикла for мы вызвали wg.Add(1) для увеличения счетчика группы ожидания на единицу. Внутри самой функции мы используем wg.Done(), чтобы сообщить WaitGroup, что текущий газ горутины завершил свое выполнение.

Затем, в конце нашего приложения, мы вызвали wg.Wait(), который блокирует основной процесс, пока счетчик WaitGroup снова не станет 0.

использованная литература