Sobes.tech
Junior — Middle

Ինչպե՞ս է վարվում 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։