Sobes.tech
Senior

Tudna példákat adni a WithCancel, WithTimeout és WithDeadline használatára?

sobes.tech MI

Válasz az MI-től

A Go nyelv context csomagjában vannak olyan függvények, amelyek lehetővé teszik kontextusok létrehozását, amelyek leállíthatók és időkorlátokkal rendelkeznek:

  • WithCancel — létrehoz egy olyan kontextust, amely manuálisan leállítható a cancel() függvény hívásával. Akkor használjuk, amikor egy műveletet esemény hatására kell megszakítani.

  • WithTimeout — létrehoz egy olyan kontextust, amely automatikusan leáll, miután egy megadott időtartamot eltelt.

  • WithDeadline — létrehoz egy olyan kontextust, amely egy adott időpontban leáll.

Példák:

ctx, cancel := context.WithCancel(context.Background())
// Indítunk egy goroutine-t, amely 2 másodperc múlva leállítja a kontextust
//
go func() {
    time.Sleep(2 * time.Second)
    cancel()
}()

select {
case <-ctx.Done():
    fmt.Println("Művelet megszakítva")
}

// WithTimeout
ctxTimeout, cancelTimeout := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelTimeout()
// művelet, amely 3 másodperc múlva megszakad

// WithDeadline
deadline := time.Now().Add(5 * time.Second)
ctxDeadline, cancelDeadline := context.WithDeadline(context.Background(), deadline)
defer cancelDeadline()
// művelet, amely a megadott időpontban szakad meg

Ezek a mechanizmusok hasznosak a kérések futási idejének ellenőrzésében, hosszú műveletek megszakításában és erőforrások kezelésében.