Sobes.tech
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.WithCancel və ya context.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.