Sobes.tech
Junior — Middle

Чӣ гуна иваз кардани иҷро дар байни goroutine-ҳои гуногун дар забони Go анҷом дода мешавад?

sobes.tech AI

Ҷавоб аз AI

Дар забони барномасозии Go, иваз кардани иҷро байни goroutines аз ҷониби планировщике runtime-и Go сурат мегирад, ки модели M:N-ро амалӣ мекунад — маҷмӯи goroutines (M), ки дар рӯйхати системавии сӯрохиҳо (N) нақша гирифта шудаанд.

Планировщики Go дар шакли ҳамкорӣ ва пешакӣ кор мекунад:

  • Горутина метавонад ба таври равшан назоратро тавассути даъвати runtime.Gosched() супорад, ки имкон медиҳад дигар goroutines иҷро шаванд.
  • Планировщик метавонад goroutine-ро дар нуқтаҳои муайян (масалан, дар вақти даъвати амалҳои блокшуда, даъватҳои системавӣ, амалҳои воридот/баромад) қатъ кунад.
  • Runtime-и Go автоматӣ контекстро байни goroutines иваз мекунад ва ҳолати онҳоро нигоҳ медорад (стек, сабтҳо).

Бинобар ин, иваз кардани байни goroutines дар дохили runtime-и Go сурат мегирад, ва мутахассис одатан инро мустақиман назорат намекунад.

Масали равшан супоридани назорат:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // супоридани иҷро ба дигар goroutines
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("Горути асосӣ -", i)
    }
}

Ин ҷо, runtime.Gosched() имкон медиҳад, ки ба дигар goroutines гузаред.