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á.