Golang Sync

Golang Sync
Pakiet synchronizacji Golang zapewnia prymitywy synchronizacyjne, takie jak Mutex, Waitgroup, Pule, Read and Write Mutex oraz warunków zmienne.

Pozwól nam zbadać niektóre funkcje podane w tym artykule.

Golang Mutex

Synchronizacja.Mutex zapewnia prymityw Mutex, który pozwala na wzajemne wykluczenia wspólnych zasobów zapobiegających warunkom wyścigu.

Przykładowe użycie:

Pakiet Main
Importuj „Synchronizację”
func main ()
var i = 10
MUTEX: = & Sync.Mutex
Mutex.Zamek()
// tylko jedna goroutine może uzyskać dostęp do tego kodu na raz
I++
Mutex.Odblokować()

Odczyt/zapisz mutex

Synchronizacja.RWMUTEX zapewnia czytelnik/pisarz Mutex. Oferuje podobne metody jak prymitywny mutx, ale może umożliwić współbieżne odczyty za pomocą metod RLOCK i Runlock:

var i = 10
MUTEX: = & Sync.Rwmutex
Mutex.Zamek()
// tylko jedna goroutine może uzyskać dostęp do tego kodu na raz
I++
Mutex.Odblokować()
Mutex.Rlock ()
I ++ // współbieżne odczyty
Mutex.Runlock ()

Poprzedni przykład może pozwolić ponad jedną goroutiną na odczytanie kodu. W przeciwieństwie do synchronizacji.Mutex, który pozwala dokładnie jeden czytelnik i jeden pisarz na raz.

Grupy oczekujące

Synchronizacja.Waitgroup służy do oferowania mechanizmu blokującego dla Goroutinów. Korzystając z grupy oczekujących, możesz zablokować wykonywanie funkcji, dopóki wszystkie Goroutines nie zakończą wykonywania.

Działa poprzez utworzenie licznika, który zawiera liczbę goroutinów do poczekać. Po zakończeniu goroutiny licznik zmniejsza się o 1. Gdy licznik wyniesie 0, grupa oczekujących odblokowuje wykonanie.

Aby dodać wartość do licznika Waitgroup, możemy użyć metody add (), która ma wartość liczb całkowitą.

Aby usunąć goroutinę z licznika po zakończeniu, używamy metody gotów (). Na przykład:

Pakiet Main
import (
„FMT”
„Synchronizacja”
)
func main ()
WG: = & Sync.Waitgroup
dla i: = 0; I < 5; i++
WG.Dodaj (1)
Go Func (x int)
fmt.Printf („Pracownik: %d działanie \ n”, x)
WG.Zrobione()
(I)

WG.Czekać()

W poprzednim przykładzie zwiększamy wartość licznika grupy oczekujących o 1 poprzez użycie funkcji add ().

Po zakończeniu goroutiny zmniejszamy licznik o 1 za pomocą metody gotów (). Poprzedni kod powinien zwrócić dane wyjściowe jako:

Pracownik: 4 bieganie
Pracownik: 2 bieganie
Pracownik: 1 bieganie
Pracownik: 3 bieganie
Pracownik: 0 Running

Raz

Synchronizacja.Kiedyś prymitywne zapewnia, że ​​funkcja działa tylko raz. Przykładem jest to, jak pokazano poniżej:

var po synchronizacji.Raz
Runonce: = func ()
fmt.Println („Uruchom raz”)

Done: = Make (CHAN String)
dla i: = 0; I < 5; i++
GO FUNC ()
raz.Do (runonce)
zrobione <- "Hi"
()

dla i: = 0; I < 5; i++
<-done

Wniosek

Ten przewodnik obejmuje podstawowe i podstawowe prymitywy dostarczone przez pakiet Go Sync. Ponadto omówiono prymitywy synchronizacyjne, takie jak Mutex, Waitgroup, Pule, Read and Write Mutex oraz zmienne stanowe. Mamy nadzieję, że ten artykuł jest pomocny. Sprawdź inne artykuły w Linux, aby uzyskać więcej wskazówek i samouczków.