Golang Ergroup

Golang Ergroup

Pakiet Golang Ergroup służy do dostarczania narzędzi do synchronizacji, propagacji błędów i anulowania kontekstu dla grupy goroutin, które wykonują wspólne zadanie.

Spójrzmy na sposób korzystania z pakietu Ergroup.

Importuj wymagany pakiet

Aby użyć pakietu Ergroup, musisz go zaimportować za pomocą klauzuli importu. Poniższy przykładowy przykład pokazuje, jak zaimportować pakiet Ergroup.

Importuj „Golang.org/x/sync/errgroup "

Z funkcją kontexta

Pakiet Errgroup zapewnia nam funkcję z kontext. Funkcja zwraca nową grupę i powiązany kontekst.

Jeśli przekazana funkcja zwraca błąd bez 0-zerowy lub zwraca się, kontekst zostaje anulowany.

Go Func

Druga funkcja dostarczona przez pakiet Ergroup to funkcja Go. Ta funkcja wywołuje określoną funkcję do nowej goroutiny.

Jeśli pierwsze połączenie zwraca błąd niezwiązany z NIL, anuluje kontekst.

Poczekaj FUNC

Trzecia funkcja to funkcja oczekiwania. Ta funkcja czeka blok, aż funkcja wywołana z metody Go zwróci wartość.

Przykład

Zobaczmy, jak możemy użyć pakietu Ergroup. Zacznijmy od zestawu procedur, które po prostu drukują wartość.

Pakiet Main
importować „fmt”
func main ()
dla i: = 0; I < 10; i++
Idź fmt.Println („zadanie przetwarzania:”, i)

Tutaj mamy pętlę, która po prostu uruchamia garść goroutinów i drukuje bieżącą wartość w iteracji pętli.

Jeśli uruchomimy powyższy kod, zauważysz, że tak naprawdę niczego nie drukuje. Wynika to z faktu, że Goroutiny znajdują się wewnątrz głównej funkcji, a gdy główna funkcja się skończy, Go zakończy cały program, niezależnie od tego, czy Goroutines zakończyła.

Możemy to rozwiązać za pomocą pakietu synchronizacji ze standardowej biblioteki. Sprawdź nasz samouczek na temat Golang Sync, aby dowiedzieć się więcej.

https: // linuxhint.com/golang-sync/

Możemy na nowo zdefiniować powyższy kod za pomocą Waitgroups, jak pokazano poniżej:

Pakiet Main
import (
„FMT”
„Synchronizacja”
)
func main ()
WG: = & Sync.Waitgroup
dla i: = 0; I < 10; i++
WG.Dodaj (1)
Go Func (zadanie int)
Zadać WG.Zrobione()
fmt.Println („zadanie przetwarzania:”, zadanie)
(I)

WG.Czekać()

Tutaj wprowadzamy „współbieżność” za pomocą grup oczekujących. Krótko mówiąc, grupa oczekująca to licznik, który pozwala nam zablokować funkcję główną przed wychodzeniem.

Grupa Waitgroup działa, tworząc licznik, który utrzymuje pod koniec liczby Goroutines w Que. Po zakończeniu Goroutine usuwamy ją z Que. Gdy Que wynosi 0, grupa Waitglock odbierze wykonanie i wraca do Main.

Zwróć uwagę na funkcję dodawania? Używamy tego, aby dodać wartość do licznika Que Waitgroup. Po zakończeniu wykonywania usuwamy ukończoną goroutinę za pomocą metody gotowej.

Za pomocą Errgroup

W powyższym przykładzie przetwarzamy grupę gorutin za pomocą pakietu synchronizacji w Go. Jednak nie ma mechanizmu do obsługi jakichkolwiek błędów. Chociaż nie jest to konieczne dla prostego przykładu, jak pokazano powyżej, jest to ważne dla wielu aplikacji.

W tym celu możemy użyć funkcji Errgroup, która pozwala obsłużyć błędy w grupie oczekiwania. Spójrz na poniższy przykład:

Pakiet Main
import (
„FMT”
"dziennik"
„Math/Rand”
„Golang.org/x/sync/errgroup "
)
Func Task (Task Int) Błąd
Jeśli Rand.Intn (10) == zadanie
zwróć fmt.Errorf („zadanie %v nie powiodło się”, zadanie)

fmt.Printf („zadanie %v zakończone”, zadanie)
powrót zero

func main ()
np.: i ​​errgroup.Grupa
dla i: = 0; I < 10; i++
zadanie: = i
np.Go (func () błąd
Zadanie powrotu (zadanie)
)

Jeśli err: = np.Czekać(); błądzić != zero
dziennik.Fatalny („błąd”, err)

fmt.Println („zakończony pomyślnie!")

W tym przykładzie wprowadzamy prostą funkcję, która generuje losową liczbę całkowitą. Jeśli wartość losowa jest równa zadaniu, zwracamy błąd.

Następnie używamy grupy błędów do obsługi błędów za pomocą funkcji grupy .

Zamknięcie

Ten przewodnik obejmował sposób wprowadzania i pracy z grupami Waitgroups i obsługą błędów za pomocą pakietu Ergroup.