Junior — Middle
Амалҳои чӣ гуна дар кори барнома ҳангоми муайян кардани GOMAXPROCS ба 1 ва оғоз кардани goroutine беохир пайдо мешаванд?
sobes.tech AI
Ҷавоб аз AI
GOMAXPROCS-ийн тохиргоог 1 болгох нь Go төлөвлөгчийн ашиглах боломжтой үйлдлийн системийн утасны тоог нэг утсанд хязгаарлана. Энэ нөхцөлд хязгааргүй goroutine эхлүүлбэл:
- Бүх тооцоолол нэг утсан дээр дараалалтай гүйцэтгэгдэнэ.
- Хязгааргүй goroutine нь контекст шилжих цэгүүдийг агуулдаггүй бол (жишээ нь, блоклох үйлдлүүд эсвэл
runtime.Gosched()дуудлага), бусад goroutine-ууд гүйцэтгэлийн цаг авахгүй байж болно, энэ нь програмыг "зогсох" болгоно. - Үр дүнд нь, програм хариу өгөхөө больж эсвэл маш удаан ажиллах боломжтой бөгөөд төлөвлөгч goroutine-уудын хооронд үр дүнтэй шилжих боломжгүй болно.
Жишээ:
package main
import (
"runtime"
"time"
"fmt"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// хязгааргүй цикл, `runtime.Gosched()` дуудлагагүй
}
}()
time.Sleep(time.Second)
fmt.Println("Програм дууслаа")
}
Энэ жишээнд, үндсэн goroutine нь гүйцэтгэлийн цаг авахгүй байж болно, хэрвээ хязгааргүй goroutine удирдлагыг шилжүүлдэггүй бол, энэ нь програмыг "зогсох" болгоно.