Sobes.tech
Junior — Middle

Czy możliwe jest, że gorutyna zostanie przerwana lub zatrzyma się sama?

sobes.tech AI

Odpowiedź od AI

W Go, wykonanie goroutine może zakończyć się samoistnie w kilku przypadkach:

  • Goroutine zakończyła swoją funkcję. Gdy funkcja uruchomiona w goroutine zakończy się, goroutine się kończy.
  • Panic wewnątrz goroutine. Jeśli w goroutine wystąpi panic i nie zostanie obsłużony, goroutine zakończy się nagle.
  • Anulowanie za pomocą kontekstu (context). Jeśli goroutine nasłuchuje sygnału anulowania przez context.Context i go otrzyma, może poprawnie się zakończyć.

Ważne jest, aby zrozumieć, że goroutine nie są przerywane z zewnątrz siłowo — trzeba zaimplementować własny mechanizm zatrzymania, na przykład za pomocą kanałów lub kontekstów.

Przykład użycia kontekstu do anulowania goroutine:

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

go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine zakończona")
            return
        default:
            // praca
        }
    }
}(ctx)

// W pewnym momencie wywołujemy cancel()
cancel()

W ten sposób goroutine kończy się albo sama po zakończeniu pracy, albo na sygnał anulowania, jeśli jest to przewidziane.