Как се държи програма на езика Go при зададени GOMAXPROCS = 1 и стартиране на горутина с безкраен цикъл, ако при това се опитате да изпълните друга част от кода?
sobes.tech AI
Отговор от AI
Когато зададете GOMAXPROCS=1 в програма на Go, броят на системните нишки, които могат да работят едновременно, се ограничава до едно. Ако стартирате горутина с безкраен цикъл без да извиквате функции, които позволяват на планировчика да превключва контекста (например, time.Sleep, runtime.Gosched), тази горутина ще заеме единствената нишка и ще блокира изпълнението на други горутини.
В резултат, друга част от кода, изпълнявана в други горутини, няма да може да се изпълнява паралелно и ще чака, докато безкрайният цикъл не предаде управлението. Това се дължи на факта, че планировчикът на горутините на Go на ниво потребител превключва изпълнението между горутините, но при GOMAXPROCS=1 има само една ОС нишка, и ако горутината не позволява на планировчика да превключи, останалите се блокират.
Пример:
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.