Sobes.tech
Junior — Middle

Kaip teisingai sustabdyti vykstančią goroutine, jei reikia, kad ji baigtųsi pagal išorinį signalą ar sąlygą, net jei rezultatas dar nepasiektas?

sobes.tech AI

Atsakymas iš AI

Norint teisingai sustabdyti veikiančią gorutininą pagal išorinį signalą ar sąlygą Go kalboje, dažnai naudojamas kontekstas (context.Context) arba kanalai signalo perdavimui.

Pavyzdys naudojant kontekstą:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Gauta atšaukimo signalas, užbaigiame gorutina
            return
        default:
            // Atlikti darbą
        }
    }
}

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

    // Tam tikru momentu iškviečiame cancel() norėdami sustabdyti gorutina
    cancel()
}

Šis požiūris leidžia gorutinei reguliariai tikrinti, ar buvo išsiųstas sustabdymo signalas, ir tinkamai užbaigti, net jei rezultatas dar nepasiekiamas. Panašiai galima naudoti kanalą signalo perdavimui, tačiau context yra idiomatiškesnis ir patogesnis būdas Go kalboje.