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 main23import (4"context"5"fmt"6"time"7)89func main() {10ctx, cancel:= context.WithTimeout(context.Background(), 2*time.Second)11defer cancel()1213result:= make(chan string)1415go func() {16time.Sleep(3 * time.Second)17result <- "İşlem tamamlandı"18}()1920select {21case msg:= <-result:22fmt.Println(msg)23case <-ctx.Done():24fmt.Println("Timeout! İşlem iptal edildi.")25}26}Beklenen çıktı: `Timeout! İşlem iptal edildi.`
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 main23import (4"context"5"fmt"6"time"7)89func main() {10ctx, cancel:= context.WithCancel(context.Background())1112go func() {13for i:= 1; i <= 5; i++ {14select {15case <-ctx.Done():16fmt.Println("Goroutine durduruldu")17return18default:19fmt.Printf("Adım %d\n", i)20time.Sleep(500 * time.Millisecond)21}22}23}()2425time.Sleep(1500 * time.Millisecond)26cancel()27time.Sleep(500 * time.Millisecond)28}Beklenen çıktı:
1Adım 12Adım 23Adım 34Goroutine durdurulduGoroutine 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.
0 yorum