Sobes.tech
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 удирдлагыг шилжүүлдэггүй бол, энэ нь програмыг "зогсох" болгоно.