Sobes.tech
Junior — Middle

Goroutine-in kəsilməsi və ya öz-özünə dayanması mümkündürmü?

sobes.tech Süni İntellekt

AI-dan cavab

Go'da, goroutine'nin öz-özünə sona çatması bir neçə halda mümkündür:

  • Goroutine öz funksiyasını tamamladı. Goroutine içində işlədilən funksiya sona çatdıqda, goroutine bağlanır.
  • Goroutine daxilində panika. Əgər goroutine daxilində panika baş verərsə və idarə olunmazsa, o qəfil sona çatacaq.
  • Kontekst (context) vasitəsilə ləğv. Əgər goroutine context.Context vasitəsilə ləğv siqnalını dinləyirsə və alırsa, düzgün şəkildə sona çatdırıla bilər.

Əhəmiyyətli olan, goroutine'lərin xaricdən zorla kəsilməməsidir — dayanma mexanizmini özünüz tətbiq etməlisiniz, məsələn, kanallar və ya kontekstlər vasitəsilə.

Kontekst istifadə edərək goroutine'yi ləğv etmə nümunəsi:

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

go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine tamamlandı")
            return
        default:
            // iş
        }
    }
}(ctx)

// Bir vaxt, cancel() çağırırıq
cancel()

Bu şəkildə, goroutine ya öz işi bitdikdə, ya da ləğv siqnalı alındıqda, planlaşdırıldığı kimi sona çatır.