Sobes.tech
Junior — Middle

Kaip teisingai sustabdyti goroutine vykdymą naudojant kontekstą Go?

sobes.tech AI

Atsakymas iš AI

Norint teisingai sustabdyti goroutines Go kalboje, dažnai naudojamas context paketas. Sukuriamas kontekstas su galimybe atšaukti (context.WithCancel), kuris perduodamas goroutine. Viduje goroutine, konteksto būsena periodiškai tikrinama <-ctx.Done(). Kai iškviečiama atšaukimo funkcija, kanalas Done() uždaromas, ir goroutine gali teisingai užbaigti darbą.

Pavyzdys:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine sustabdyta")
            return
        default:
            // vykdyti darbą
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // po tam tikro laiko sustabdyti goroutine
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Millisecond * 100) // kad goroutine turėtų laiko užbaigti
}

Šis požiūris leidžia saugiai ir kontroliuojamai užbaigti goroutine be nesaugios metodų naudojimo.