«waitGroup» — важная вещь в то время, когда нужно работать с горутинами, потому что она поможет нам, когда нам нужно дождаться завершения всех горутин.

«waitGroup» помогает нам с моделью fork-join, используемой горутинами, потому что основной поток ожидает, пока процесс, выполняемый в ответвлении, снова не присоединится к основному потоку.

«waitGroup» определила четыре метода, которые помогут нам управлять «жизненным циклом»: add(), wait(), done() и state(). Опишем каждый из них:

  • add(int)
    Используется для указания/добавления всех горутин в группу ожидания. При добавлении горутин основной поток будет ждать, пока все они не будут завершены, вызвав done().
  • wait()
    Используется для указания в коде, что поток ожидает завершения горутин.
  • done()
    Используется, чтобы указать, что логика горутины завершена.
  • state()
    State возвращает указатели на поля состояния и sema, хранящиеся в wg.state*. — (Взято из документации golang)

Как все эти методы взаимодействуют друг с другом?

  • Таким образом, когда мы добавляем горутин в «waitGroup», мы должны убедиться, что завершаем ее с помощью done(), другими словами, нам нужно пометить как «Done()» равное количество горутин, которые мы указываем с помощью «Добавить()», если мы этого не сделаем, код запаникует с «фатальной ошибкой: все горутины спят — тупик!».
  • Код, определенный после вызова метода «Wait()», будет выполняться до тех пор, пока не будут выполнены все горутины.
  • Если ожидание не вызывается, то все горутины в «waitGroup» будут выполняться асинхронно в отдельном процессе.

Теперь давайте рассмотрим пример, чтобы увидеть «waitGroup» в действии.

В следующем примере мы собираемся выполнить три горутины. Затем в строке 13 мы добавляем их в «waitGroup», чтобы имитировать процесс, мы просто добавляем время сна, которое в этом примере отличается для каждой из горутин, я делаю это, чтобы показать вам, что время не имеет значения. для завершения горутины группа ожидания остановит поток до тех пор, пока все горутины не будут «Готово».

Вывод:

Прохладный! … мы закончили с использованием группы ожидания. В следующих статьях мы рассмотрим мьютекс, который поможет нам синхронизировать логику между горутинами.

Следующий шаг: Как реализовать Mutex

Эта статья связана с учебным пособием по параллелизму Golang, которое вы можете найти по следующей ссылке:

https://medium.com/@josueparra2892/concurrency-in-go-bf93e23bebd4