Sobes.tech
Junior — Middle

Je možné, že plánovač nenúti gorutinu vzdať sa vykonávania?

sobes.tech AI

Odpoveď od AI

V Go, plánovač goroutine (scheduler) zvyčajne sám riadi prepínanie medzi goroutine, aby zabezpečil konkurenčné vykonávanie. Avšak môže nastať situácia, keď goroutine neodovzdá riadenie, ak vykonáva dlhú synchronnú operáciu bez volania funkcií, ktoré môžu spôsobiť prepínanie plánovača (napríklad systémové volania, operácie vstupu/výstupu alebo volanie runtime.Gosched()).

To je spôsobené tým, že Go používa kooperatívne multitasking na úrovni goroutine: prepínanie sa deje na určitých bodoch, ako sú volania blokujúcich operácií alebo runtime.Gosched(). Ak goroutine vykonáva nekonečný cyklus bez týchto bodov, môže «zablokovať» plánovač a neodovzdať riadenie iným goroutine-om.

Príklad:

for {
    // ak tu nie sú volania, ktoré môžu odovzdať plánovaču,
    // goroutine nemusí odovzdať vykonávanie iným
}

Preto sa odporúča vkladať volania runtime.Gosched() alebo používať kanály/blokujúce operácie, aby sa umožnilo plánovaču prepínať medzi goroutine-ami.