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