WaitGroup — это примитив синхронизации, который сообщает вашей программе, когда набор go-процедур завершен.

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

Начните с примера

Ниже приведен простой пример использования WaitGroup.

  • Строка № 1: создайте переменную WaitGroup
  • Строка №3–№10: определите две разные функции для запуска в отдельных gили подпрограммах.
  • Строка № 12: добавьте две горутины в WaitGroup.
  • Строка №14–№15: запуск двух горутин.
  • Строка 17: основная горутина ожидает завершения двух горутин.
  • Конец

Как показано в примере, WaitGroup похожа на параллельно-безопасный счетчик, который можно увеличивать и уменьшать. Мы вызываемфункциюAdd, чтобы увеличить счетчик, и функцию Done, чтобы уменьшить счетчик.

Основная горутина заблокируется, когда мы выполним функцию Wait, пока счетчик не станет равным нулю.

Когда использовать

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

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

Таким образом, примитив синхронизации WaitGroup подходит для следующих ситуаций:

  • Когда нас не волнует результат параллельных горутин,
  • Когда у нас есть другие средства сбора их результатов.

Использовать примечание

  1. Функция Add вызывается вне горутин, которые они помогают отслеживать. Мы бы ввели состояние гонки, если бы не сделали этого.

2. Если WaitGroup явно передается в функцию, это следует делать с помощьюуказателя.

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

4. Любые переменные, на которые ссылается замыкание из «внешней» области видимости, являются не копией, а ссылкой. Лучше всего передать любые аргументы, которые вы хотите использовать для функции goroutine.

Надеюсь, вам понравилось это читать 😄. Если вы хотите поддержать меня ☕ как писателя, рассмотрите возможность подписки стать участником Medium. Вы также получите неограниченный доступ ко всем историям на Medium.