Junior — Middle
Jak można zorganizować i zarządzać kolejnością wykonywania wątków?
sobes.tech AI
Odpowiedź od AI
W języku Go, do organizacji i zarządzania kolejnością wykonywania goroutine używa się kilku głównych mechanizmów:
-
Kanały (channels) — pozwalają na synchronizację goroutine, przesyłając dane między nimi. Goroutine odczytująca z kanału będzie czekać, aż inna goroutine wyśle dane, co zapewnia kolejność.
-
sync.WaitGroup — służy do oczekiwania na zakończenie grupy goroutine. Pozwala czekać, aż wszystkie uruchomione goroutine zakończą pracę.
-
Mutex i inne prymitywy z pakietu sync — do ochrony wspólnych zasobów i zapobiegania wyścigom.
Przykład użycia kanałów do sekwencyjnego wykonywania:
package main
import (
"fmt"
)
func worker(id int, done chan bool) {
fmt.Printf("Pracownik %d rozpoczął\n", id)
// symulacja pracy
done <- true // sygnał o zakończeniu
}
func main() {
done := make(chan bool)
go worker(1, done)
<-done // czekamy na zakończenie pracownika 1
go worker(2, done)
<-done // czekamy na zakończenie pracownika 2
fmt.Println("Wszyscy pracownicy zakończyli")
}
W ten sposób, korzystając z kanałów i synchronizacji, można zarządzać kolejnością wykonywania goroutine.