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.WithCancelyokicontext.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.