Junior — Middle
Go-da işləyən bir neçə goroutine-i zorla necə dayandırmaq olar?
sobes.tech Süni İntellekt
AI-dan cavab
Go dilində, işləyən bir neçə gorutini zorla dayandırmaq üçün adətən kontekst (context.Context) vasitəsilə ləğv mexanizmi istifadə olunur.
Əsas fikir:
- Ləğv edilə bilən kontekst yaradılır (
context.WithCancelvə yacontext.WithTimeout). - Hər bir gorutina bu konteksti qəbul edir və mütəmadi olaraq onun ləğv olunub-olunmadığını yoxlayır.
- Ləğv funksiyası (
cancel()) çağırıldıqda, bütün gorutinalar siqnal alır və düzgün şəkildə sona çatmağa imkan verir.
Nümunə:
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 dayandırıldı\n", id)
return
default:
// gorutinin işi
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Bir müddət sonra bütün gorutinaları dayandırırıq
time.Sleep(1 * time.Second)
cancel()
// Başa çatmasını gözləyirik (məsələn, sync.WaitGroup ilə)
Bu yanaşma, çox sayda gorutinin mərkəzləşdirilmiş idarə olunmasını təmin edir və nəzarətsiz sonlandırma problemlərindən qaçmağa kömək edir.