Sobes.tech
Junior — Middle

Go tilida GOMAXPROCS = 1 o'rnatilgan va cheksiz sikl bilan gorutina ishga tushirilgan holda, agar shu paytga qadar kodning boshqa qismini bajarishga harakat qilsangiz, dastur qanday harakat qiladi?

sobes.tech AI

AIdan javob

Go dasturida GOMAXPROCS=1 o'rnatilganda, tizim iplarining bir vaqtning o'zida ishlash mumkin bo'lgan soni birga cheklangan bo'ladi. Agar cheksiz siklga ega gorutina ishga tushirilsa va kontekstni o'zgartirishga imkon beradigan funksiyalar chaqirilmasa (masalan, time.Sleep, runtime.Gosched), bu gorutina yagona ipni egallab, boshqa gorutinlarning bajarilishini to'xtatadi.

Natijada, boshqa gorutinlarda ishga tushirilgan kod qismi parallel ravishda bajarilmaydi va cheksiz sikl boshqaruvni qo'yib yuborganini kutadi. Bu, Go ning gorutinlar planlashtiruvchisi foydalanuvchi darajasida ishlashini va gorutinlar o'rtasida bajarishni o'zgartirishini, ammo GOMAXPROCS=1 bo'lsa, faqat bitta OS ipi mavjud bo'lib, agar gorutina o'zgarishga imkon bermasa, boshqalar bloklanadi.

Misol:

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// cheksiz sikl, yield qilmasdan
		}
	}()

	time.Sleep(time.Second) // gorutina ishga tushishini kutamiz

	fmt.Println("Boshqa kod qismi") // ehtimol hech qachon bajarilmaydi
}

To'sqinliklarni oldini olish uchun, cheksiz sikl ichida planlashtiruvchiga kontekstni o'zgartirish imkonini beradigan chaqiriqlar, masalan, runtime.Gosched() yoki time.Sleep qo'yilishi kerak.