Sobes.tech
Junior — Middle

Go dilinde bir program GOMAXPROCS = 1 olarak ayarlandığında ve sonsuz döngüye sahip bir goroutine başlatıldığında, aynı zamanda başka bir kod parçasını çalıştırmaya çalışırsanız nasıl davranır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go programında GOMAXPROCS=1 ayarlandığında, aynı anda çalışan sistem iş parçacığı sayısı bir ile sınırlandırılır. Sonsuz döngüye sahip ve planlayıcının bağlam değiştirmesine izin veren fonksiyonları çağırmayan (örneğin, time.Sleep, runtime.Gosched) bir goroutine başlatılırsa, bu goroutine tek iş parçacığını kullanır ve diğer goroutinelerin çalışmasını engeller.

Sonuç olarak, diğer goroutinelerde çalışan kod parçası paralel olarak çalışamaz ve sonsuz döngü kontrolü devralana kadar bekler. Bu, Go'nun kullanıcı seviyesindeki goroutine planlayıcısının, goroutineler arasında yürütmeyi değiştirmesiyle ilgilidir, ancak GOMAXPROCS=1 ile yalnızca bir işletim sistemi iş parçacığı vardır ve goroutine değişimi izin verilmezse, diğerleri engellenir.

Örnek:

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ı için zaman tanı

	fmt.Println("Başka bir kod parçası") // belki hiç çalışmayabilir
}

Engellemeleri önlemek için, sonsuz döngüye, planlayıcının geçiş yapmasına izin veren çağrılar eklenmelidir, örneğin runtime.Gosched() veya time.Sleep.