Sobes.tech
Junior — Middle

Ako zastaviť vykonávanie goroutine, ak ešte nebola dosiahnutá očakávaná hodnota?

sobes.tech AI

Odpoveď od AI

V jazyku Go, na zastavenie gorutiny, ktorá čaká na hodnotu, ale táto hodnota nemusí prísť, sa zvyčajne používajú kanály s timeoutom alebo kontext s zrušením.

Príklad s timeoutom pomocou select a time.After:

select {
case val := <-ch:
    // hodnota prijatá, pokračujeme v práci
case <-time.After(time.Second * 5):
    // timeout, zastavíme gorutinu
}

Iný spôsob je použitie kontextu (context.Context), ktorý možno zrušiť zvonku:

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

go func() {
    select {
    case val := <-ch:
        // spracovať val
    case <-ctx.Done():
        // zastaviť gorutinu
    }
}()

// niekde v kóde zavoláme cancel(), aby sme zastavili gorutinu

Týmto spôsobom gorutina nebude čakať nekonečne a môže byť správne ukončená.