Sobes.tech
Junior — Middle

Go tilida bir nechta ishga tushayotgan goroutine'larni majburan to'xtatish qanday amalga oshiriladi?

sobes.tech AI

AIdan javob

Go tilida, bir nechta ishga tushirilgan gorutinlarni majburan to'xtatish uchun odatda kontekst (context.Context) orqali bekor qilish mexanizmi qo'llaniladi.

Asosiy g'oya:

  • Bekor qilish bilan kontekst yaratiladi (context.WithCancel yoki context.WithTimeout).
  • Har bir gorutin bu kontekstni qabul qiladi va vaqti-vaqti bilan uni bekor qilinganligini tekshiradi.
  • Bekor qilish funksiyasi (cancel()) chaqirilganda, barcha gorutinlar signal oladi va to'g'ri tarzda yakunlanishi mumkin.

Misol:

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Goroutine %d to'xtatildi\n", id)
                return
            default:
                // gorutinning ishlashi
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Bir muddat o'tgach, barcha gorutinlarni to'xtatamiz
time.Sleep(1 * time.Second)
cancel()

// Yakunlanishini kutamiz (masalan, sync.WaitGroup yordamida)

Bu yondashuv, bir nechta gorutinlarni markaziy boshqarish imkonini beradi va nazorat qilinmagan yakunlanish muammolaridan qochishga yordam beradi.