Sobes.tech
Back to questions
Junior — Middle
84

Как ведет себя программа в языке Go при установке GOMAXPROCS = 1 и запуске горутины с бесконечным циклом, если при этом попытаться выполнить другую часть кода?

Answer from AI

sobes.tech 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.