Go'da Context: Timeout ve İptal Mekanizması

# Go'da Context: Timeout ve İptal Mekanizması

Go'da eşzamanlı programlamada kontrol sağlamak kritiktir. Context paketi, goroutine'leri zaman sınırı içinde çalıştırmak ya da dışarıdan iptal etmek için tasarlanmıştır. Özellikle API çağrıları, veritabanı sorguları ve uzun işlemler için vazgeçilmezdir.

Context, bir deadline (son tarih) veya cancel signal (iptal sinyali) taşıyan bir nesnedir. Bir parent context'ten child context'ler türetebilir, böylece iptal işlemi ağaç yapısında yayılır. `context.Background()` boş bir context'ten başlarsın; `WithTimeout()` ve `WithCancel()` ile bunu genişletirsin.

Zaman sınırı belirlemek için `context.WithTimeout()` kullan:

1package main
2
3import (
4"context"
5"fmt"
6"time"
7)
8
9func main() {
10ctx, cancel:= context.WithTimeout(context.Background(), 2*time.Second)
11defer cancel()
12
13result:= make(chan string)
14
15go func() {
16time.Sleep(3 * time.Second)
17result <- "İşlem tamamlandı"
18}()
19
20select {
21case msg:= <-result:
22fmt.Println(msg)
23case <-ctx.Done():
24fmt.Println("Timeout! İşlem iptal edildi.")
25}
26}

Beklenen çıktı: `Timeout! İşlem iptal edildi.`

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Goroutine 3 saniye beklerken, context 2 saniye sonra timeout verir. `ctx.Done()` kanalı kapanır ve select ifadesi bu durumu yakalar.

Manuel iptal için `context.WithCancel()` kullan:

1package main
2
3import (
4"context"
5"fmt"
6"time"
7)
8
9func main() {
10ctx, cancel:= context.WithCancel(context.Background())
11
12go func() {
13for i:= 1; i <= 5; i++ {
14select {
15case <-ctx.Done():
16fmt.Println("Goroutine durduruldu")
17return
18default:
19fmt.Printf("Adım %d\n", i)
20time.Sleep(500 * time.Millisecond)
21}
22}
23}()
24
25time.Sleep(1500 * time.Millisecond)
26cancel()
27time.Sleep(500 * time.Millisecond)
28}

Beklenen çıktı:

1Adım 1
2Adım 2
3Adım 3
4Goroutine durduruldu

Goroutine 3 adım sonra `cancel()` çağrısı ile durdurulur.

Her zaman `defer cancel()` kullan. Context'i geçtiğin fonksiyonlarda `ctx.Done()` kanalını kontrol et. Böylece dış iptal sinyallerine hızlı yanıt verirsin.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz