Sobes.tech
Middle

Go'da alt veri bağlamı oluşturmanın ne gibi imkanlar sağlar?

sobes.tech yapay zeka

AI'dan gelen yanıt

context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue kullanılarak oluşturulan alt bağlam (child context) aşağıdaki imkanları sağlar:

  • İptal: Ana bağlamı etkilemeden, alt bağlamda başlatılan işlemleri iptal etmeye olanak tanır. Bu, bağlam oluşturulurken döndürülen iptal fonksiyonunun çağrılmasıyla gerçekleştirilir.
  • Zaman aşımı / Son tarih: İşlemlerin çalışma süresini sınırlar. İşlem tamamlanmadan önce zaman dolar ise, bağlam otomatik olarak iptal edilir.
  • Değer iletimi: İstek veya işlemle ilgili belirli değerleri, fonksiyon çağrısı zinciri boyunca aşağıya doğru iletmeye olanak tanır (örneğin, istek kimliği, kimlik doğrulama verileri), fonksiyon imzalarını değiştirmeden.
  • Hiyerarşi: Bağlamların hiyerarşik yapısını oluşturur. Ana bağlamın iptali, otomatik olarak tüm alt bağlamların iptal edilmesine neden olur.
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// Ana bağlam, 3 saniye sonra iptal edilir
	parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancelParent() // Ana bağlamın iptal edileceğinden emin ol

	// İptal ile alt bağlam oluştur
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Alt bağlamın iptal edileceğinden emin ol

	// Bağlamın iptalini bekleyen fonksiyon
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Bu blok, bağlam iptal edildiğinde çalışır
			fmt.Println("Alt goroutine iptal edildi:", ctx.Err())
		}
	}(childCtx) // Alt bağlamı goroutine'e geçir

	// İptal demonstrasyonu için yapay gecikme
	time.Sleep(5 * time.Second)

	fmt.Println("Program sona erdi")
}

Bu örnekte, 3 saniyelik zaman aşımıyla ana bağlam otomatik olarak alt bağlamı iptal eder, bu da goroutine'in sonlanmasına neden olur. Alt bağlam, manuel olarak cancelChild() çağrısı ile de iptal edilebilir, ana bağlamın zaman aşımı süresi dolmadan önce.