Sobes.tech
Junior — Middle

Планировщик гурутинанын аткарууну токтотуусун мажбурлабайбы?

sobes.tech AI

AIден жооп

Go тилиндеги, goroutine планировщусу (scheduler) адатта өзү башкарган болот, goroutine'лердин ортосунда которууну камсыз кылуу үчүн. Бирок, бир goroutine узак убакытка созулган синхрондук операцияны аткарып жатканда жана планировщикти которууга мүмкүнчүлүк берүүчү функцияларды чакырбаса (мисалы, системдик чакыруулар, кирүү/чыгуу операциялары же runtime.Gosched() чакыруусу), анда ал планировщикти которбой калуусу мүмкүн.

Бул, Go колдонуп жаткан кооперативдүү көп тапшырмалуулук деңгээлинде: которуу белгилүү бир чекиттерде болот, мисалы, блоктоочу операциялар же runtime.Gosched() чакыруусу. Эгер goroutine мындай чекиттерсиз чексиз циклде иштеп жатса, ал «блоктой» планировщикти жана башка goroutine'лерге башкарууну өткөрбөй калат.

Мисал:

for {
    // эгер бул жерде планировщикке өткөрө турган чакыруулар жок болсо,
    // goroutine башкага өткөрбөй калат
}

Ошондуктан, планировщикке goroutine'лердин ортосунда которууга мүмкүндүк берүү үчүн runtime.Gosched() чакырууларын кошуу же каналдар/блоктоочу операцияларды колдонуу сунушталат.