Загрузка…
Загрузка…
Go · junior · сложность 3
Канонический способ дождаться завершения всех рабочих горутин в Go — использовать sync.WaitGroup. Он обеспечивает простой и надежный шаблон: увеличьте счетчик перед запуском задания, уменьшите его после его завершения и вызовите Wait() в основной горутине.
Создайте var wg sync.WaitGroup.
Перед каждым вызовом горутины wg.Add(1).
Внутри горутины выполните defer wg.Done().
В основной горутине вызовите wg.Wait().
WaitGroup подсчитывает количество незавершенных задач.
Wait() блокирует выполнение до тех пор, пока счетчик не достигнет нуля.
Это гарантирует, что main не завершится раньше рабочих горутин.
Вызов Add(1) после запуска горутины (риск гонки и
неправильное завершение).
Забудьте Done() в ветке ошибки или ранней return.
Повторное использование одного и того же WaitGroup на разных этапах без четкого
synchronization.
errgroup:Если помимо ожидания вам также необходимо:
собираем первую ошибку,
отменить другие задачи с помощью context,
тогда практичнее использовать errgroup.Group.
Для задачи «дождаться завершения всех горутин» стандартным инструментом является sync.WaitGroup: простой контракт, предсказуемое поведение и производственная надежность.
Канонический способ дождаться завершения всех рабочих горутин в Go — использовать sync.WaitGroup.