Sobes.tech
Junior — Middle

Kā uzvedas Go valodā programma, kad GOMAXPROCS ir iestatīts uz 1 un tiek palaista gorutina ar bezgalīgu ciklu, ja tajā pašā laikā mēģināt izpildīt citu koda daļu?

sobes.tech AI

Atbilde no AI

Iestatot GOMAXPROCS=1 Go programmā, vienlaicīgi var darboties tikai viens sistēmas pavedienu skaits. Ja palaidīsiet gorutīnu ar bezgalīgu ciklu bez funkcijām, kas ļauj plānotājam pārslēgt kontekstu (piemēram, time.Sleep, runtime.Gosched), šī gorutīna aizņems vienīgo pavedienu un bloķēs citu gorutīnu izpildi.

Rezultātā cita koda daļa, kas darbojas citās gorutīnās, nevarēs darboties paralēli un gaidīs, kamēr bezgalīgais cikls nodos kontroli. Tas ir saistīts ar to, ka Go gorutīnu plānotājs lietotāja līmenī pārslēdz izpildi starp gorutīnām, bet ar GOMAXPROCS=1 ir tikai viens OS pavedienu, un, ja gorutīna neļauj plānotājam pārslēgt, pārējās tiek bloķētas.

Piemērs:

package main

import (
	"fmt"
	"runtime"
	"time"
)

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// bezgalīgs cikls bez yield
		}
	}()

	time.Sleep(time.Second) // dodam laiku gorutīnai sākt

	fmt.Println("Cita koda daļa") // var nekad netikt izpildīta
}

Lai izvairītos no bloķēšanas, bezgalīgā ciklā ir jāievieto izsaukumi, kas ļauj plānotājam pārslēgt kontekstu, piemēram, runtime.Gosched() vai time.Sleep.