Sobes.tech
Junior — Middle

Ինչպե՞ս է կատարվում տարբեր goroutine-ների միջև կատարումը փոխելը Go լեզվում։

sobes.tech AI

Պատասխան AI-ից

Go լեզվում, goroutines-ների միջև կատարումը փոխելու գործընթացը իրականացնում է Go runtime-ի պլանավորիչը, որը իրականացնում է M:N մոդելը — goroutines-ների (M) միավորումը, որոնք պլանավորվում են համակարգի թելերի (N) վրա:

Go պլանավորիչը աշխատում է համագործակցային և կանխարգելիչ ռեժիմով:

  • Գորուտին կարող է բացահայտորեն փոխանցել վերահսկողությունը runtime.Gosched() կանչելով, ինչը թույլ է տալիս մյուս goroutines-ներին գործարկել:
  • Պլանավորիչը կարող է ընդհատել գորուտին որոշակի կետերում (օրինակ, բլոկավորող գործողությունների, համակարգային կանչերի, մուտք/ելք գործողությունների ժամանակ):
  • Go runtime-ը ավտոմատ կերպով փոխում է կոնտեքստը գորուտինների միջև, պահելով նրանց վիճակը (ստեկ, ռեգիստրներ):

Այսպիսով, գորուտինների միջև փոխումը տեղի է ունենում Go runtime-ի ներսում, և ծրագրավորողը սովորաբար դա ուղղակիորեն կառավարում է:

Օրինակ՝ բացահայտ փոխանցման օրինակ՝

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("Հիմնական goroutine -", i)
    }
}

Այստեղ runtime.Gosched() թույլ է տալիս անցնել մյուս goroutines-ներին։