Ինչպե՞ս է վարվում Go լեզվի ծրագրավորումը, երբ GOMAXPROCS = 1 է սահմանված և սկսվում է անսահման ցիկլով goroutine, եթե միաժամանակ փորձեք կատարել այլ մասի կոդը։
sobes.tech AI
Պատասխան AI-ից
Երբ GOMAXPROCS=1 սահմանվում է Go ծրագրում, համակարգի թելերի քանակը, որոնք կարող են միաժամանակ աշխատել, սահմանափակվում է մեկով: Եթե սկսեք անսահման ցիկլով goroutine, առանց այնպիսի ֆունկցիաներ կանչելու, որոնք թույլ են տալիս պլանավորողին փոխել կոնտեքստը (օրինակ՝ time.Sleep, runtime.Gosched), ապա այդ goroutine-ն զբաղեցնելու է միակ թելը և կխոչընդոտի մյուս goroutine-ների կատարմանը:
Արդյունքում, մյուս մասի կոդը, որը աշխատում է այլ goroutine-ներում, չի կարող կատարվել զուգահեռ և կսպասի, մինչև անսահման ցիկլը փոխանցի կառավարումը: Սա կապված է այն բանի հետ, որ Go-ի goroutine պլանավորիչը օգտագործողի մակարդակում փոխում է կատարմանը goroutine-ների միջև, բայց GOMAXPROCS=1 պարագայում կա միայն մեկ օպերացիոն համակարգի թել, և եթե goroutine-ն չի թույլ տալիս պլանավորողին փոխել, մյուսները բլոկվում են:
Օրինակ՝
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// անսահման ցիկլ առանց yield
}
}()
time.Sleep(time.Second) // ժամանակ ենք տալիս goroutine-ին սկսելու համար
fmt.Println("Այլ մաս կոդից") // կարող է երբեք չկատարվի
}
Կարևոր է, որ անսահման ցիկլում պետք է ավելացնել կանչեր, որոնք թույլ են տալիս պլանավորողին փոխել կոնտեքստը, օրինակ՝ runtime.Gosched() կամ time.Sleep։