Sobes.tech
Junior — Middle

Jak poprawnie zatrzymać uruchomioną gorutynę, jeśli konieczne jest, aby zakończyła się w zależności od zewnętrznego sygnału lub warunku, nawet jeśli wynik jeszcze nie został uzyskany?

sobes.tech AI

Odpowiedź od AI

Aby poprawnie zatrzymać działającą gorutynę na podstawie zewnętrznego sygnału lub warunku w Go, zazwyczaj używa się kontekstu (context.Context) lub kanałów do przekazywania sygnału anulowania.

Przykład z użyciem kontekstu:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Odebrano sygnał anulowania, kończymy gorutynę
            return
        default:
            // Wykonujemy pracę
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // W pewnym momencie wywołujemy cancel() aby zatrzymać gorutynę
    cancel()
}

Takie podejście pozwala gorutynie regularnie sprawdzać, czy został wysłany sygnał zatrzymania, i poprawnie się kończyć, nawet jeśli wynik jeszcze nie został uzyskany. Podobnie można użyć kanału do przekazywania sygnału zatrzymania, ale context jest bardziej idiomatycznym i wygodnym sposobem w Go.