Sobes.tech
Junior

Go'da kontekst nima?

sobes.tech AI

AIdan javob

Go'da (context.Context) kontekst, yakuniy muddat, bekor qilish signali va so'rovga xos ma'lumotlarni olib yuradigan ob'ekt. Bu, goroutine'larning hayot aylanishini boshqarish va ular orasida ma'lumot uzatish uchun ishlatiladi.

Asosiy xususiyatlar:

  • Konkurrentlik uchun xavfsiz: U xavfsiz tarzda goroutine'lar orasida o'tkazilishi mumkin.
  • O'zgarmas: Bir marta yaratilgach, Context o'zgartirilmaydi. Merosxo'r kontekstlar ota kontekst asosida yaratiladi.
  • Hierarxik: Kontekstlar daraxt shaklida bo'lib, (context.Background() yoki context.TODO()) bilan boshlanadi. Ota kontekstning bekor qilinishi, barcha bolalarining bekor qilinishiga olib keladi.

context paketining asosiy funksiyalari:

  • context.Background() : Bo'sh kontekst, odatda main-funksiyada, yuqori darajadagi so'rovlar yoki testlarda ishlatiladi. Hech qachon bekor qilinmaydi.
  • context.TODO() : Shuningdek, bo'sh kontekst. Qachonki, qaysi kontekstni ishlatishni bilmasangiz yoki kontekst funksionalligi hali amalga oshirilmagan bo'lsa, foydalaniladi.
  • context.WithCancel(parent Context) : Yangi bolalar kontekstini va bekor qilish funksiyasini qaytaradi. Bu funksiyani chaqirish, bu kontekst va uning barcha bolalarini bekor qiladi.
  • context.WithDeadline(parent Context, deadline time.Time) : Belgilangan vaqtga yetganda avtomatik ravishda bekor qilinadigan bolalar kontekstini qaytaradi. Shuningdek, qo'lda bekor qilish uchun funksiyani ham qaytaradi.
  • context.WithTimeout(parent Context, timeout time.Duration) : WithDeadline bilan bir xil, faqat davomiylik bilan.
  • context.WithValue(parent Context, key, val interface{}) : Kalitga asoslangan qiymat bilan bolalar kontekstini qaytaradi.

Qo'llanilishi:

  • Amallarni bekor qilish: Masalan, HTTP so'rovining timeouti yoki uzoq davom etadigan operatsiyani to'xtatish.
  • Ma'lumotlarni uzatish: Masalan, so'rov ID'si loglash uchun, autentifikatsiya ma'lumotlari.

context.WithTimeout dan foydalanish misoli:

package main

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

func longRunningOperation(ctx context.Context, resultChan chan string) {
	select {
	case <-time.After(3 * time.Second):
		// Operatsiya muvaffaqiyatli yakunlandi
		resultChan <- "Operatsiya yakunlandi"
	case <-ctx.Done():
		// Kontekst bekor qilindi
		err := ctx.Err() // Bekor qilish sababini olamiz
		resultChan <- fmt.Sprintf("Operatsiya bekor qilindi: %v", err)
	}
}

func main() {
	// 2 sekundlik timeout bilan kontekst yaratamiz
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel() // Bekor qilish funksiyasini chaqirishni ta'minlash

	resultChan := make(chan string, 1)

	go longRunningOperation(ctx, resultChan)

	// Natija yoki bekor qilishni kutamiz
	select {
	case res := <-resultChan:
		fmt.Println(res)
	case <-ctx.Done():
		fmt.Printf("Asosiy kontekst tugadi: %v\n", ctx.Err())
	}

	// Agar bekor qilinsa, goroutine tugashiga biroz kutamiz
	time.Sleep(1 * time.Second)
}

Ushbu misolda, longRunningOperation kontekstning bekor qilinishini tekshiradi. Agar asosiy kontekstning timeouti (2 sekund) undan oldin (3 sekund) tugasa, goroutine ctx.Done() orqali bekor qilish signalini oladi va tugaydi.