Sobes.tech
Junior — Middle

Jak zatrzymać wykonanie goroutine, jeśli oczekiwana wartość jeszcze nie została osiągnięta?

sobes.tech AI

Odpowiedź od AI

W Go, aby zatrzymać gorutynę oczekującą na wartość, ale ta wartość może nie nadejść, zwykle używa się kanałów z limitem czasu lub kontekstu z anulowaniem.

Przykład z limitem czasu za pomocą select i time.After:

select {
case val := <-ch:
    // odebrano wartość, kontynuuj pracę
case <-time.After(time.Second * 5):
    // limit czasu, zatrzymaj gorutynę
}

Inny sposób to użycie kontekstu (context.Context), który można anulować z zewnątrz:

ctx, cancel := context.WithCancel(context.Background())

go func() {
    select {
    case val := <-ch:
        // przetwórz val
    case <-ctx.Done():
        // zatrzymaj gorutynę
    }
}()

// gdzieś w kodzie wywołujemy cancel(), aby zatrzymać gorutynę

W ten sposób gorutyna nie będzie oczekiwać w nieskończoność i będzie mogła się poprawnie zakończyć.