Чӣ гуна рафтор мекунад барномаи дар забони Go вақте GOMAXPROCS = 1 таъин карда мешавад ва як goroutine бо як давраи беохир оғоз мешавад, агар дар ҳамин ҳол кӯшиш кунед қисми дигаре аз коди барномаро иҷро кунед?
sobes.tech AI
Ҷавоб аз AI
Ҳангоми танзим кардани GOMAXPROCS=1 дар барномаи Go, шумораи сӯрохиҳои системавӣ, ки метавонанд ҳамзамон кор кунанд, ба яке маҳдуд мешавад. Агар як goroutine бо доираи беохир оғоз карда шавад ва функсияҳое, ки ба планировщик имкон медиҳанд, ки контекстро иваз кунад (масалан, time.Sleep, runtime.Gosched), ин goroutine танҳо як сӯрохиро ишғол мекунад ва иҷрои дигар goroutine-ҳоро монеъ мешавад.
Натиҷа, ки қисми дигаре аз коди, ки дар goroutine-ҳои дигар иҷро мешавад, наметавонад параллелӣ иҷро шавад ва интизор мешавад, ки доираи беохир идома диҳад ва назоратро супорад. Ин ба он вобаста аст, ки планировщик goroutine-ҳои Go дар сатҳи корбарӣ иҷроишро байни goroutine-ҳо иваз мекунад, аммо бо GOMAXPROCS=1 танҳо як сӯрохии системаи оператсионӣ вуҷуд дорад, ва агар goroutine имконият надода бошад, ки планировщик иваз кунад, дигар goroutine-ҳо монеъ мешаванд.
Масалан:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// доираи беохир бе yield
}
}()
time.Sleep(time.Second) // вақти оғозро медиҳем
fmt.Println("Басқа қисми коди") // мумкин аст, ки ҳеҷ гоҳ иҷро нашавад
}
Барои пешгирӣ аз монеъшавӣ, дар доираи беохир бояд даъватҳо дохил карда шаванд, ки ба планировщик имкон медиҳанд, ки иваз кунад, масалан, runtime.Gosched() ё time.Sleep.