Sobes.tech
Junior — Middle

Kā pareizi apturēt darbojošu goroutine, ja nepieciešams, lai tas beigtos atkarībā no ārēja signāla vai nosacījuma, pat ja rezultāts vēl nav saņemts?

sobes.tech AI

Atbilde no AI

Lai pareizi apturēt darbināmo gorutīnu ar ārēju signālu vai nosacījumu Go valodā, parasti izmanto kontekstu (context.Context) vai kanālus signāla atsaukšanai.

Piemērs ar konteksta izmantošanu:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Saņemts atsaukšanas signāls, apturam gorutīnu
            return
        default:
            // Veicam darbu
        }
    }
}

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

    // Kādā brīdī izsaucam cancel() lai apturētu gorutīnu
    cancel()
}

Šī pieeja ļauj gorutīnai regulāri pārbaudīt, vai ir nosūtīts apturēšanas signāls, un pareizi pabeigt, pat ja rezultāts vēl nav saņemts. Līdzīgi var izmantot kanālu signāla pārraidīšanai, bet context ir idiomātiskāks un ērtāks veids Go valodā.