Sobes.tech
Junior — Middle

Go dilində GOMAXPROCS = 1 təyin olunduqda və sonsuz dövr ilə goroutine başladıldıqda, eyni zamanda kodun başqa bir hissəsini icra etməyə çalışırsınızsa, proqram necə davranır?

sobes.tech Süni İntellekt

AI-dan cavab

Go proqramında GOMAXPROCS=1 qurulduqda, eyni zamanda işləyə bilən sistem iplərinin sayı bir ilə məhdudlaşır. Əgər sonsuz döngüyə malik goroutine işə salınsa və planlayıcının kontekst dəyişməsinə imkan verən funksiyalar çağırılmasa (məsələn, time.Sleep, runtime.Gosched), bu goroutine yeganə ipi tutacaq və digər goroutinlərin icrasını bloklayacaq.

Nəticədə, digər goroutinlərdə işləyən kod hissəsi paralel şəkildə icra oluna bilməz və sonsuz döngü idarəni təhvil verənə qədər gözləyəcək. Bu, Go-nun istifadəçi səviyyəsindəki goroutine planlayıcısının, goroutinlər arasında icrağı dəyişdirməsi ilə əlaqədardır, lakin GOMAXPROCS=1 olarsa, yalnız bir OS ipi mövcuddur və əgər goroutine dəyişməyə imkan verməzsə, digər goroutinlər bloklanır.

Nümunə:

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// sonsuz döngü, yield olmadan
		}
	}()

	time.Sleep(time.Second) // goroutine-in başlaması üçün vaxt veririk

	fmt.Println("Başqa bir kod hissəsi") // bəlkə heç vaxt icra olunmayacaq
}

Bloklamaları aradan qaldırmaq üçün, sonsuz döngüdə planlayıcının kontekst dəyişməsinə imkan verən çağırışlar, məsələn, runtime.Gosched() və ya time.Sleep əlavə edilməlidir.