Sobes.tech
Junior — Middle

Kā piespiedu kārtā apturēt vairākas darbojošās goroutines Go valodā?

sobes.tech AI

Atbilde no AI

Go valodā bieži izmanto mehānismu, kas ļauj piespiedu kārtā apturēt vairākas darbojošās gorutīnas, izmantojot konteksta (context.Context) atcelšanas mehānismu.

Galvenā ideja:

  • Tiek izveidots atcelšanas konteksts (context.WithCancel vai context.WithTimeout).
  • Katra gorutina saņem šo kontekstu un periodiski pārbauda, vai tas nav atcelts.
  • Kad tiek izsaukta atcelšanas funkcija (cancel()), visas gorutinas saņem signālu un var pareizi beigt darbu.

Piemērs:

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

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Gorutina %d apturēta\n", id)
                return
            default:
                // gorutinas darbs
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Pēc kāda laika apturam visas gorutinas
time.Sleep(1 * time.Second)
cancel()

// Gaidām, līdz tās pabeigs darbu (piemēram, ar sync.WaitGroup)

Šī pieeja ļauj centralizēti pārvaldīt vairākas gorutinas un izvairīties no nekontrolēta beigu problēmām.