irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
"İptal Et" Butonunun Arkasındaki Güç
Bir web sunucusu yazdınız. Kullanıcı bir rapor istedi, veritabanı sorgusu başladı ve işlemin 10 saniye süreceği belli.Kullanıcı 2. saniyede sıkıldı ve tarayıcıyı kapattı. Ne olur?- Context Kullanmazsanız: Sunucu habersizce 8 saniye daha çalışır, sonucu bulur ve kimseye gönderemez. Kaynak israfı!
- Context Kullanırsanız: Kullanıcı gittiği an, veritabanı sorgusu da dahil tüm işlemler anında iptal edilir.
context.WithTimeout
Go'da her işlem (goroutine), bir Context taşımalıdır.
Kod:
package main
import ("context""fmt""time")
// Uzun süren bir işlemi simüle eden fonksiyonfunc islemYap(ctx context.Context) {select {case <-time.After(5 * time.Second): // İşlem 5 saniye sürüyorfmt.Println("İşlem başarıyla bitti!")case <-ctx.Done(): // Context'ten "Bitti/İptal" sinyali gelirsefmt.Println("İşlem İPTAL EDİLDİ:", ctx.Err())}}
func main() {// 1. Boş bir context oluşturctx := context.Background()
// 2. Bu context'e 2 saniyelik bir zaman aşımı (Timeout) kuralı ekle<br>// Yani: "Bu işlem 2 saniyede bitmezse, öldür."<br>ctx, cancel := context.WithTimeout(ctx, 2*time.Second)<br><br>// cancel fonksiyonunu main bitince çağırmak iyi pratiktir (Kaynak temizliği)<br>defer cancel()<br><br>fmt.Println("İşlem başlıyor...")<br>islemYap(ctx) <br><br>// Sonuç: İşlem 5 saniye sürecekti ama biz 2 saniye süre verdik.<br>// Çıktı: İşlem İPTAL EDİLDİ: context deadline exceeded<br>
}