Sobes.tech
Junior — Middle

Как се държи програма на езика 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.