Golang Errgroup

создайте карточную игру с Golang (Go) Программирование и разработка

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

Давайте посмотрим, как использовать пакет errgroup.

Импорт необходимого пакета

Чтобы использовать пакет errgroup, вам необходимо импортировать его с помощью предложения import. В приведенном ниже примере кода показано, как импортировать пакет errgroup.

import «golang.org/x/sync/errgroup»

Витконтекстная функция

Пакет errgroup предоставляет нам функцию WithContext. Функция возвращает новую группу и связанный с ней контекст.

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

Перейти Func

Вторая функция, предоставляемая пакетом errgroup, — это функция Go. Эта функция вызывает указанную функцию для новой горутины.

Если первый вызов возвращает ненулевую ошибку, это отменяет контекст.

Wait Func

Третья функция — это функция ожидания. Эта функция ожидает блок, пока вызовы функции из метода Go не вернут значение.

Пример

Давайте посмотрим, как мы можем использовать пакет errgroup. Давайте начнем с набора подпрограмм go, которые просто печатают значение.

package main
import «fmt»
func main() {
for i := 0; i < 10; i++ {
go fmt.Println(«Processing task: «, i)
}
}

Здесь у нас есть цикл for, который просто запускает кучу горутин и печатает текущее значение в итерации цикла.

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

Мы можем переопределить приведенный выше код, используя группы ожидания, как показано ниже:

package main
import (
«fmt»
«sync»
)

func main() {
wg := &sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func (task int)  {
defer wg.Done()
fmt.Println(«Processing task: «, task)

}(i)
}
wg.Wait()
}

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

Группа ожидания работает, создавая счетчик, который отслеживает количество горутин в очереди. Как только горутина завершается, мы удаляем ее из очереди. Как только очередь становится равной 0, группа ожидания разблокирует выполнение и возвращается к основной.

Обратите внимание на функцию «Добавить»? Мы используем это, чтобы добавить значение к счетчику очереди группы ожидания. Как только выполнение завершено, мы удаляем завершенную горутину с помощью метода Done.

Using Errgroup

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

Для этого мы можем использовать функцию errgroup, которая позволяет обрабатывать ошибки в группе ожидания. Взгляните на пример ниже:

package main
import (
«fmt»
«log»
«math/rand»

«golang.org/x/sync/errgroup»
)
func Task(task int) error {
if rand.Intn(10) == task {
return fmt.Errorf(«Task %v failed», task)
}
fmt.Printf(«Task %v completed», task)
return nil
}
func main() {
eg := &errgroup.Group{}
for i := 0; i < 10; i++ {
task := i
eg.Go(func() error {
return Task(task)
})
}
if err := eg.Wait(); err != nil {
log.Fatal(«Error», err)
}
fmt.Println(«Completed successfully!»)
}

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

Затем мы используем группу ошибок для обработки ошибок с помощью функций Group{} и Go.

Заключение

В этом руководстве рассказывается, как внедрять группы ожидания и работать с ними, а также обрабатывать ошибки с помощью пакета errgroup.

Читайте также:  Оператор сравнения перегрузки in C++
Оцените статью
bestprogrammer.ru
Добавить комментарий