Sobes.tech
Junior — Middle

Jak poprawnie zatrzymać wykonywanie goroutine'ów za pomocą kontekstu w Go?

sobes.tech AI

Odpowiedź od AI

Aby poprawnie zatrzymać goroutine w Go, często używa się pakietu context. Tworzy się kontekst z możliwością anulowania (context.WithCancel), który jest przekazywany do goroutine. Wewnątrz goroutine okresowo sprawdzany jest stan kontekstu przez <-ctx.Done(). Gdy wywołuje się funkcję anulowania, kanał Done() zostaje zamknięty, a goroutine może się poprawnie zakończyć.

Przykład:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine zatrzymana")
            return
        default:
            // wykonywanie pracy
        }
    }
}

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

    // po pewnym czasie zatrzymujemy goroutine
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Millisecond * 100) // aby goroutine zdążyła się zakończyć
}

Takie podejście pozwala bezpiecznie i kontrolowanie kończyć goroutine bez użycia niebezpiecznych metod.