Sobes.tech
Senior

Czy możesz podać przykłady użycia WithCancel, WithTimeout i WithDeadline?

sobes.tech AI

Odpowiedź od AI

W pakiecie context w Go znajdują się funkcje do tworzenia kontekstów z możliwością anulowania i ograniczeniem czasu wykonania:

  • WithCancel — tworzy kontekst, który można anulować ręcznie, wywołując funkcję cancel(). Używa się go, gdy trzeba przerwać operację na podstawie zdarzenia.

  • WithTimeout — tworzy kontekst, który automatycznie zostanie anulowany po określonym czasie.

  • WithDeadline — tworzy kontekst, który zostanie anulowany w określonym momencie.

Przykłady:

ctx, cancel := context.WithCancel(context.Background())
// Uruchamiamy gorutynę, która anuluję kontekst po 2 sekundach
go func() {
    time.Sleep(2 * time.Second)
    cancel()
}()

select {
case <-ctx.Done():
    fmt.Println("Operacja anulowana")
}

// WithTimeout
ctxTimeout, cancelTimeout := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelTimeout()
// operacja, która zostanie przerwana po 3 sekundach

// WithDeadline
deadline := time.Now().Add(5 * time.Second)
ctxDeadline, cancelDeadline := context.WithDeadline(context.Background(), deadline)
defer cancelDeadline()
// operacja, która zostanie przerwana w określonym czasie

Te mechanizmy są przydatne do kontrolowania czasu wykonywania zapytań, anulowania długich operacji i zarządzania zasobami.