Golang Waitgroup

Golang Waitgroup
Golang Waitgroup umożliwia blokowanie określonego bloku kodu, aby umożliwić zestawowi Goroutines na zakończenie wykonania. Przykładem byłoby zablokowanie głównej funkcji do momentu zakończenia Goroutinów, a następnie odblokowania grupy.

Przykład 1

Weźmy przykład poniżej:

Pakiet Main
importować „fmt”
funcrt ()
fmt.Println („Pierwsza rutyna Go”)

funcrt2 ()
fmt.Println („druga rutyna Go”)

funcMain ()
Go rt ()
Go RT2 ()

Jeśli uruchomisz powyższy kod, program nic nie drukuje. Wynika to z faktu, że główna funkcja jest zakończona po uruchomieniu Goroutines. Ponieważ główną funkcją jest punkt wejścia programu Go, po zakończeniu programu kończy się.

Aby poradzić sobie z taką sprawą, możemy użyć Golang Waitgroup. Metoda Waitgroup ma trzy główne metody:

  1. Add () - grupa oczekująca działa jako licznik trzymający liczbę funkcji lub procedury do oczekiwania. Jeśli licznik stanie się 0, grupa oczekujących uwalnia Goroutines. Używamy metody dodawania, aby dodać określoną wartość do licznika Waitgroup.
  2. WAIL () - Metoda oczekiwania blokuje wykonanie, aż licznik grupy Waitgh.
  3. Done () - zmniejsza licznik grupy oczekujących o wartość 1

Odtworzmy teraz poprzedni przykład i użyj Waitgroup, aby zatrzymać wykonanie.

Pakiet Main
import (
„FMT”
„Synchronizacja”
)
Funcrt (WG *Sync.Waitgroup)
fmt.Println („Pierwsza rutyna Go”)
Deferwg.Done () // Usuń Goroutine z licznika Waitgroup

funcrt2 (WG *Sync.Waitgroup)
fmt.Println („druga rutyna Go”)
Deferwg.Zrobione()

funcMain ()
// nowa grupa oczekująca
WG: = nowy (synchronizacja.Grupa oczekująca)
// Dodaj dwie rutyny
WG.Dodaj (2)
Go RT (WG)
Go RT2 (WG)
// blokuj wykonanie do czasu zakończenia
WG.Czekać()

Teraz, jeśli ponownie uruchomimy kod, powinniśmy postrzegać wyjście jako:

$ Go Run Waitgroup.Iść
Druga rutyna
Pierwsza rutyna

Przykład 2

Możesz także używać grup oczekujących z funkcjami anonimowymi. Przykładem jest to, jak pokazano poniżej:

Pakiet Main
import (
„FMT”
„Synchronizacja”
)
WG.Zrobione()
//
funcMain ()
varwgsync.Waitgroup
fori: = 1; I<= 5; i++
WG.Dodaj (1)
i: = i
gofunc ()
Deferwg.Zrobione()
fmt.Printf („Rozpoczęcie rutyny: %d \ n”, i)
()

WG.Czekać()

Powyższy przykład ilustruje, jak używać grup Waitgroup z funkcją anonimową. Kod powyżej powinien zwrócić:

Rozpoczęcie rutyny: 1
Rozpoczęcie rutyny: 3
Rozpoczęcie rutyny: 4
Rozpoczęcie rutyny: 5
Rozpoczęcie rutyny: 2

Wniosek

W tym artykule omówiliśmy podstawy pracy z podkładką Waitgroup z pakietu synchronizacji w Go. Waitgroups umożliwia zatrzymanie wykonania, aż grupa funkcji lub Goroutines zakończy się wykonaniem.