«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