Sobes.tech
Junior — Middle

Go тилинде ар кандай goroutine'лердин ортосунда ишти аткарууну кантип алмаштыруу жүргүзүлөт?

sobes.tech AI

AIден жооп

Go тилинде, goroutine'лар аралыгындагы иштөө өзгөрүшү Go runtime планировщигу тарабынан жүргүзүлөт, ал M:N моделин ишке ашырат — goroutine'лар (M) системдик агымдар (N) үстүндө пландаштырылат.

Go планировщигу кызматташтык жана алдын ала токтотуу режиминде иштейт:

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

Ошентип, goroutine'лар арасындагы которуу Go runtime ичинде болот, жана программист көбүнчө булду түздөн-түз көзөмөлдөбөйт.

Ачык башкаруу мисалы:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // башка goroutine'ларга өтүү
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("Негизги goroutine -", i)
    }
}

Бул жерде runtime.Gosched() башка goroutine'ларга өтүүгө мүмкүндүк берет.