Is het mogelijk dat een planner een goroutine niet dwingt om de uitvoering over te nemen?
sobes.tech AI
Antwoord van AI
In Go beheert de scheduler van goroutines (scheduler) meestal de wissel tussen goroutines om gelijktijdige uitvoering te garanderen. Het kan echter voorkomen dat een goroutine niet wordt overgedragen als deze een langdurige synchronisatie-operatie uitvoert zonder functies aan te roepen die een scheduler-overgang kunnen veroorzaken (bijvoorbeeld systeemoproepen, invoer/output-operaties of het aanroepen van runtime.Gosched()).
Dit komt doordat Go coöperatief multitasken op goroutine-niveau gebruikt: de overgang vindt plaats op bepaalde punten, zoals bij het aanroepen van blokkerende operaties of runtime.Gosched(). Als een goroutine een oneindige lus uitvoert zonder deze punten, kan deze de «scheduler blokkeren» en de controle niet aan andere goroutines overdragen.
Voorbeeld:
for {
// als hier geen oproepen zijn die aan de scheduler kunnen worden overgedragen,
// kan de goroutine de uitvoering niet aan anderen overdragen
}
Het wordt daarom aanbevolen om oproepen naar runtime.Gosched() in te voegen of kanalen/blokkerende operaties te gebruiken om de scheduler tussen goroutines te laten wisselen.