Sobes.tech
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:

  1. 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ść.

  2. sync.WaitGroup — służy do oczekiwania na zakończenie grupy goroutine. Pozwala czekać, aż wszystkie uruchomione goroutine zakończą pracę.

  3. 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.