Sobes.tech
Junior — Middle

Jak správně zastavit běžící gorutinu, pokud je třeba, aby skončila na základě externího signálu nebo podmínky, i když výsledek ještě nebyl získán?

sobes.tech AI

Odpověď od AI

Pro správné ukončení běžící gorutiny na základě externího signálu nebo podmínky v jazyce Go se obvykle používají kontext (context.Context) nebo kanály pro přenos signálu zrušení.

Příklad s použitím kontextu:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Obdržen signál zrušení, ukončujeme gorutinu
            return
        default:
            // Provádíme práci
        }
    }
}

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

    // V určitém okamžiku zavoláme cancel() pro ukončení gorutiny
    cancel()
}

Tento přístup umožňuje gorutinu pravidelně kontrolovat, zda byl odeslán signál ukončení, a správně se ukončit, i když výsledek ještě nebyl získán. Podobně lze použít kanál pro přenos signálu ukončení, ale context je idiomatickejší a pohodlnější způsob v jazyce Go.