როგორ იქცევა პროგრამა ენის Go-ში, როდესაც GOMAXPROCS = 1 არის დაყენებული და იწყება გორუტინა უსასრულო ციკლით, თუ ამ დროს ცდილობთ სხვა ნაწილის შესრულებას?
sobes.tech AI
პასუხი AI-სგან
Go программасында GOMAXPROCS=1 коюлганда, бир убакта иштей турган системалык жиптердин саны бирге чектелет. Эгер сиз чексиз цикл менен goroutine баштасаңыз жана планировщикке контекстти алмаштыруу мүмкүнчүлүгүн берген функцияларды чакырбасаңыз (мисалы, time.Sleep, runtime.Gosched), анда бул goroutine жалгыз жипти ээлеп, башка goroutine-дардын иштешин тоскоол болот.
Натыйжада, башка goroutine-ларда иштеп жаткан код бөлүгү параллелдүү иштей албайт жана чексиз цикл башкарууну өткөрүп бергенге чейин күтөт. Бул Go-нин goroutine планировчусунун колдонуучу деңгээлинде иштешин жана goroutine-дар арасында ишти алмаштырышын билдирет, бирок GOMAXPROCS=1 болсо, бир гана ОС жип бар, жана эгер goroutine планировщикке алмашууга мүмкүнчүлүк бербесе, башка 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.